【问题标题】:PIVOT query in SQLSQL 中的 PIVOT 查询
【发布时间】:2019-03-14 11:10:48
【问题描述】:

下面的 sql 语句出现错误。错误读取:

FROM 子句中的错误:“SELECT”附近 无法解析查询

错误消息:关键字“SELECT”附近的语法不正确。 ')' 附近的语法不正确

有什么想法吗?

SELECT *
FROM (
  SELECT [Order], Dept, Area, [Final Week], Total
 FROM dbo.DeptSummary10Weeks
) AS SourceTable 
PIVOT (Sum(Total) FOR [Final Week] IN (SELECT WeekNum FROM dbo.[10Weeks]) AS PivotTable;

【问题讨论】:

  • 您缺少右括号。
  • 我一定是失明了,我看不到支架应该去哪里。在 AS PivotTable 之前添加它,但仍然得到相同的消息
  • 我正在使用 SQL Expresss
  • SELECT * FROM (SELECT [Order], Dept, Area, [Final Week], Total FROM dbo.DeptSummary10Weeks) 作为 SourceTable PIVOT (Sum(Total) FOR [Final Week] IN (SELECT WeekNum FROM dbo.[10Weeks])) 作为数据透视表;试试这个。
  • 我的声明现在显示为 SELECT * FROM (SELECT [Order], Dept, Area, [Final Week], Total FROM dbo.DeptSummary10Weeks) AS SourceTable PIVOT (Sum(Total) FOR [Final Week] IN (SELECT WeekNum FROM dbo.[10Weeks])) 作为数据透视表;广告我仍然收到相同的错误消息

标签: sql sql-server tsql pivot


【解决方案1】:

尝试使用明确的WeekNum 并在查询中添加右括号:

SELECT *
FROM (
  SELECT [Order], Dept, Area, [Final Week], Total
 FROM dbo.DeptSummary10Weeks
) AS SourceTable 
PIVOT (Sum(Total) FOR [Final Week] IN ([1], [2], [3], [4], [5], [6], [7])) AS PivotTable

更新:

尝试使用动态版本的数据透视:

declare @cols nvarchar(max);
declare @sql  nvarchar(max);
  select @cols = stuff((
    select distinct 
      ' , ' + CONCAT('[', CONVERT(varchar(10),  t.WeekNum), ']')
      from dbo.[10Weeks] t 
      order by 1
      for xml path (''), type).value('.','nvarchar(max)')
    ,1,2,'')

select  @sql = '
    SELECT *
    FROM (
         SELECT [Order], Dept, Area, [Final Week], Total
         FROM dbo.DeptSummary10Weeks
    ) AS SourceTable 
    PIVOT (Sum(Total) FOR [Final Week] IN (' + @cols + ') ) AS PivotTable'   

exec(@sql);

【讨论】:

  • 该语句的工作方式与您编写它的方式相同,但每周每周都在变化。我正在尝试滚动 10 周,所以它需要是 [11]、[12]、[13]、[14]、[15]、[16]、[17]、[18]、[19]、本周 [20] 但下周需要为 [12]、[13]、[14]、[15]、[16]、[17]、[18]、[19]、[20]、[21] ]
  • 好吧,当我执行它时它可以工作,但它不会让我将它保存为视图。我收到错误消息:“声明”一词附近的语法不正确
  • 设法将其用作存储过程,再次感谢
  • @Simon 很高兴它对您有所帮助!随时问任何问题。您可以将回复标记为答案并以 stackoverfow 方式表达您的感谢:),如果它回答了您的问题。 meta.stackexchange.com/questions/5234/…
【解决方案2】:

你必须为最后一周提供一些空值

  SELECT [Order], Dept, Area,'' as [Final Week], Total
     FROM dbo.DeptSummary10Weeks

请尝试以下方式...

Declare @var nvarchar(max)
Select @var = coalesce(@var +',','') + cast(WeekNum as nvarchar(20)) from dbo.[10Weeks]    
FOR [Final Week] IN ('+@var+') AS PivotTable;   

【讨论】:

  • 谢谢,但是如果我更改为这个 SELECT * FROM (SELECT [Order], Dept, Area, [Final Week], Total FROM dbo.DeptSummary) AS SourceTable PIVOT (Sum(Total) FOR [Final Week] IN ([11])) AS PivotTable;
  • 但是当我将 [11] 更改为 SELECT WeekNum FROM dbo.[10Weeks] 时,我收到了消息
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2012-05-11
相关资源
最近更新 更多