Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带CTE的动态枢轴_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 带CTE的动态枢轴

Sql 带CTE的动态枢轴,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图创建一个公共表表达式(CommonTableExpress,CTE)来存储我需要的一些数据,这些数据需要一组内部连接。然后,我想使用动态透视列透视结果。我写了下面的查询,但我得到了错误 “已定义但未使用的公用表表达式。” 如何基于CTE创建透视查询?顺便说一下,我可以不用CTE,但我想知道我是否可以用CTE DECLARE @cols nvarchar(max) DECLARE @sql nvarchar(max) SELECT @cols = isnull(@cols + ', '

我试图创建一个公共表表达式(CommonTableExpress,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)

这是你可以做到的。我已经在查询中编写了逻辑

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