【问题标题】:Dynamic Pivot with CTE带 CTE 的动态枢轴
【发布时间】:2019-03-26 01:05:49
【问题描述】:

我试图创建一个 Common Table Express(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)

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您可以这样做。我已经在查询中编写了逻辑

    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
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多