SQL - 使用 pivot 命令时出错

SQL - error when using pivot command

我在使用 pivot 命令时遇到问题 - 我收到以下错误

"Invalid column name '2013-03-22'. Invalid column name '2013-03-29'. Invalid column name '2013-04-05'. Invalid column name 'Volume'. Invalid column name 'Week Ending Date'."

当运行这个代码

SELECT * 
FROM
(
   SELECT [Area], 
     [Region], 
     [Channel], 
     [Controller], 
     [2013-03-22] AS _dt1, 
     [2013-03-29] AS _dt2, 
     [2013-04-05] AS _dt3 
  FROM [DataTable]
) AS SourceTable
PIVOT
(
   SUM ([Volume]) 
   FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], [2013-04-05])
) AS PivotTable

它似乎符合正确的格式。有什么想法吗?

通常我动态地做我的数据透视列,然后我 运行 执行 sp_executesql @query

  1. 找到不同的日期“2013-03-22”...然后将其转换为字符串 使用 STUFF 和 XML PATH

  2. 在您的嵌入式 SQL 查询中替换它

所以您永远不会对您的列进行硬编码

这里的例子我有

 DECLARE @cols AS NVARCHAR(MAX),   @query  AS NVARCHAR(MAX)
   select @cols = STUFF((SELECT  N',' + QUOTENAME(c.name) 
   FROM sys.tables AS t
   INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
   WHERE t.name = 'tagCloudLibrary'
    and c.name not in ('langID')
    FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)')  ,1,1,'')


    set @query = N'SELECT ' + @cols + N' from tagCloudLibrary'
    execute sp_executesql @query;

如果您的 PIVOT 正确,请在此处为 STUFF 执行 CORRECT WHERE CLAUSE...

  DECLARE @cols AS NVARCHAR(MAX),   @query  AS NVARCHAR(MAX)
   select @cols = STUFF((SELECT top 10  N',' + QUOTENAME(LastActivityDate)  
   FROM DataTable   
     FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)')  ,1,1,'')

     select @cols

     set query = N'SELECT * FROM
      (SELECT [Area], [Region], [Channel], [Controller], ' +  @cols 
     + N' FROM [DataTable]) AS SourceTable '
    + N' PIVOT  (SUM ([Volume]) FOR [Week Ending Date] IN (' +  @cols  + ') AS PivotTable '

     execute sp_executesql @query;

似乎源 table 不应 包含要旋转的列的值,但 应该 包含列包含要旋转的值和要旋转的值。见下文:

SELECT [Area], 
[Region], 
[Channel], 
[Controller],
[2013-03-22] as _dt1, 
[2013-03-29] as _dt2, 
[2013-04-05] as _dt3
FROM 
(
SELECT [Area], 
[Region], 
[Channel], 
[Controller], 
[Volume],
[Week Ending Date]
FROM [DataTable]
) AS SourceTable 
PIVOT(SUM ([Volume]) FOR [Week Ending Date] IN ([2013-03-22], [2013-03-29], 
[2013-04-05])) 
AS PivotTable