【问题标题】:SQL - error when using pivot commandSQL - 使用数据透视命令时出错
【发布时间】:2015-12-29 20:24:46
【问题描述】:

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

“无效的列名'2013-03-22'。无效的列名'2013-03-29'。无效的列名'2013-04-05'。无效的列名'Volume'。无效的列名'Week Ending日期'。”

运行此代码时

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

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

【问题讨论】:

  • 您已在子查询中将列重命名为 _dt1_dt2 等,因此列 [2013-03-22], [2013-03-29], [2013-04-05] 不存在。您需要使用别名的名称或跳过别名。另外,您没有名为 VolumeWeek Ending Date 的列。
  • @bluefeet:谢谢,但是通过旋转来摆脱音量和周列的想法不是吗?
  • 是的,您似乎想对其求和,但您的子查询中没有 volume 列。如果子查询中不存在该列,则无法对其求和。子查询中的哪一列包含音量值?你能用一些示例数据创建一个 SQL Fiddle 吗?或者甚至编辑您的问题以包含示例数据?
  • 谢谢@bluefeet..我可以试试这个,但它似乎更像是一个编译错误而不是数据错误..如果我在子查询中包含 [Volume] 和 [Week Ending Date],那些错误走开,但我仍然收到日期列的错误...
  • 感谢@bluefeet - 我似乎已经想通了,请参阅下面的回复。非常感谢您的帮助!

标签: sql sql-server tsql pivot


【解决方案1】:

似乎源表不应该包含要转置的列的值,但应该包含包含要转置的值和要转置的值的列.见下文:

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

【讨论】:

    【解决方案2】:

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

    1. 找到不同的 DATE '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 执行正确的 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;
    

    【讨论】:

    • 显然,谁降级了我的解决方案,他一生中从未以编程方式对他的列进行透视和硬编码
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多