2015-02-02 3 views
2

Я пытался создать Common Table Express (CTE), чтобы хранить некоторые данные, которые мне нужны, для чего требуется куча внутреннего соединения. Затем я хотел бы повернуть результат с помощью динамических столбцов. Я написал запрос ниже, но получаю ошибкуDynamic Pivot with CTE

«Обычное выражение таблицы определено, но не используется».

Как создать опорную базу запросов на CTE? Кстати, я могу сделать это без CTE, но я хотел бы знать, смогу ли я это сделать с CTE.

DECLARE @cols nvarchar(max) 
DECLARE @sql nvarchar(max) 
SELECT @cols = isnull(@cols + ', ', '') + '[' +  Convert(varchar(max),T.CostCenterNumber) + ']' FROM (SELECT distinct CostCenterNumber FROM CostCenters) as T 
;With PivotData as (
SELECT B.[Year], C.CostCenterNumber, C.CostCenterName, E.[Description] as  GLClass, D.Code, D.[GLDescription], A.Total 
From GeneralLedgers A inner join 
Years B on A.YearID = B.ID 
inner join CostCenters C on 
A.CostCenterID = C.ID 
inner join GLCodes D on 
A.GLCodeID = D.ID inner join 
GLClassificationTypes E on 
D.GLClassificationTypeID = E.ID) 


SELECT @sql = ' 
Select * 
From(
SELECT [Year], CostCenterNumber, GLClass, Code, GLDescription, Total 
FROM PivotData) as T 
PIVOT 
    (
     Max(Total) 
     for [CostCenterNumber] in (' + @cols + ') 
    )) as P' 
EXEC(@sql) 

ответ

4

Вот как вы можете это сделать. Я написал логику в запросе

DECLARE 
@cols nvarchar(max), 
@stmt nvarchar(max) 
SELECT @cols = isnull(@cols + ', ', '') + '[' + Convert(nvarchar(max),T.CostCenterNumber)+ ']' 
       FROM (SELECT distinct CostCenterNumber FROM CostCenters) as T 

SELECT @stmt = ' 
-- Your CTE goes here 
;WITH CTE AS 
(
     SELECT [Year], E.[Description] as GLClass, Code, 
     GLDescription, CostCenterNumber, Total 
     FROM GeneralLedgers A inner join 
     Years B on A.YearID = B.ID inner join 
     GLCodes C on A.GLCodeID = C.ID inner join 
     CostCenters D on A.CostCenterID = D.ID inner join 
     GLClassificationTypes E on C.GLClassificationTypeID = E.ID 
) 
-- Pivoted reuslt 
SELECT * FROM 
( 
    -- Here you select the data from CTE 
    SELECT * 
    FROM CTE 
)as T 
PIVOT 
(
    max(T.Total) 
    for T.[CostCenterNumber] in (' + @cols + ') 
) as P' 
exec sp_executesql @stmt = @stmt