-
есть 2 таблицы
Проекты (Описание некого проекта) CREATE TABLE [dbo].[project]( [id] [int] NOT NULL, [priority] [int] NOT NULL, [name] [varchar](255) NOT NULL, [sdate] [datetime] NOT NULL, [fdate] [datetime] NOT NULL, [GIP] [int] NULL, CONSTRAINT [PK_project] PRIMARY KEY CLUSTERED
и
Перекрёстная таблица "Проекты-группы" (Какие группы учавствуют в каком проекте и каков соотв. статус участия) CREATE TABLE [dbo].[group_project]( [id_project] [int] NOT NULL, [id_group] [int] NOT NULL, [id_status] [int] NOT NULL, [last_event_id] [int] NULL, CONSTRAINT [PK_group_project] PRIMARY KEY CLUSTERED
Исп. MSSQL и Delphi(BDS 2006)
dbGO (он же ADO)
подскажите почему не проходит запрос в TADODataSet (ругается на WITH):
WITH C (id_project, name, id_group, id_status) AS (SELECT id_project, name, id_group, id_status FROM group_project INNER JOIN project ON project.id=group_project.id_project)
SELECT id_project, name, [1] AS [209], [2] AS [212], [3] AS [220] FROM C PIVOT (SUM(id_status) FOR [id_group] IN ([1], [2], [3])) AS PVT
в MSSQL Server Management Studio всё работает.
-
А ты часом МССКЛ с Ораклом не спутал? :)
-
не :)
использую SQLServer2005_SSMSEE (Который бесплатный)
яж говорю, в Server Management Studio запрос проходит, а через делфи нехочит :(
-
ну так напиши без выпендрежа (без C и WITH)
-
или PIVOT только с WITH работает? BOL по 2005-му под рукой нет :(
-
Работать то работает, только из-за того что в таблице есть поле [last_event_id] [int] NULL
и в ситуации когда они в разных записях отличаются, то получается не совсем тот PIVOT что хотелось бы, т.е. получается не так как мне нужно, а вот так:
как надо:
проект название 209 212 220 312 Имя1 1 2 3 132 Имя2 2 NULL 1 ........ ........
а получается вот так (без WITH):
проект название 209 212 220 312 Имя1 1 NULL NULL 312 Имя1 NULL 2 NULL 312 Имя1 NULL NULL 3 132 Имя2 2 NULL 1 ........ ........
А так в общем разобрался, использовал ХП с параметрами
если кому надо:
ALTER PROCEDURE [dbo].[show_PVT] @pFieldsName varchar(500), @pFields varchar(100) AS
DECLARE @select VARCHAR(1000)
BEGIN
SET @select='WITH C (id_project, name, id_group, id_status) AS (SELECT id_project, name, id_group, id_status FROM group_project INNER JOIN project ON project.id=group_project.id_project) SELECT id_project, name, '+@pFieldsName+' FROM C PIVOT (SUM(id_status) FOR [id_group] IN ('+@pFields+')) AS PVT'
EXEC(@select)
В делфе получаю список id групп и их имён, а потом параметром передаю в ХП
-
> Работать то работает, только из-за того что в таблице есть > поле > [last_event_id] [int] NULL
а откуда это поле вдруг выплывет, если его нет в выборке? Я имел в виду
SELECT id_project, name, [1] AS [209], [2] AS [212], [3] AS [220] FROM ( SELECT id_project, name, id_group, id_status FROM group_project JOIN project ON project.id=group_project.id_project ) С PIVOT (SUM(id_status) FOR [id_group] IN ([1], [2], [3])) AS PVT
> > EXEC(@select)
не боишься, что твою процедуру заюзают с параметром 'bla-bla-bla DELETE * FROM project bla-bla-bla1', где bla-bla-bla и bla-bla-bla1 обеспечат синтаксисески верные SQL-предложения ? :)
|