使用 CTE 的动态枢轴
Dynamic Pivot with CTE
我试图创建一个 Common Table Express(CTE) 来存储我需要的一些数据,这需要一堆内部连接。然后,我想使用动态数据透视列对结果进行数据透视。我在下面写了查询,但出现错误
"Common table expression defined but not used."
如何基于 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)
这里是你如何做到的。我已经在查询中编写了逻辑
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
我试图创建一个 Common Table Express(CTE) 来存储我需要的一些数据,这需要一堆内部连接。然后,我想使用动态数据透视列对结果进行数据透视。我在下面写了查询,但出现错误
"Common table expression defined but not used."
如何基于 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)
这里是你如何做到的。我已经在查询中编写了逻辑
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