【问题标题】:Add A Total Row To Bottom Of Pivot将总行添加到枢轴底部
【发布时间】:2023-03-15 02:20:01
【问题描述】:

我看到使用GROUP BY CUBE() 会在数据透视的底部添加一个总计行,我一直在努力使我的语法准确,以便我可以做到这一点。好吧,我的语法正在运行,但我没有在结果集的底部得到总计。这是为什么呢?

select *
FROM
(
  select case 
  WHEN a.state LIKE 'CA' THEN 'California'
  WHEN a.state LIKE 'WA' THEN 'Washington'
  else a.state
  end As [Full State], 
  SaleID As [Sales By State], 
  CONVERT(VARCHAR(20), dt.CumulativeWeek) AS Week
  FROM retailsales.Store1 a
  INNER JOIN retailsales.customCalendar dt
  ON a.orderDate = dt.orderDate
  WHERE a.orderDate IS NOT NULL
  GROUP BY CUBE (SaleID, state, dt.CumulativeWeek)
) src
pivot
(
  COUNT([Sales By State])
  For Week IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])
) piv

我尝试将 CUBE() 语句移到我的数据透视表之外,但出现编译错误,这里是更新代码

select *
FROM
(
  select case 
  WHEN a.state LIKE 'CA' THEN 'California'
  WHEN a.state LIKE 'WA' THEN 'Washington'
  else a.state
  end As [Full State], 
  SaleID As [Sales By State], 
  CONVERT(VARCHAR(20), dt.CumulativeWeek) AS Week
  FROM retailsales.Store1 a
  INNER JOIN retailsales.customCalendar dt
  ON a.orderDate = dt.orderDate
  WHERE a.orderDate IS NOT NULL
  GROUP BY CUBE (SaleID, state, dt.CumulativeWeek)
) src
pivot
(
  COUNT([Sales By State])
  For Week IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])
) piv
GROUP BY CUBE (Full State)

这会产生这个编译错误

Msg 8120, Level 16, State 1, Line 1
Column 'piv.1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

【问题讨论】:

  • 最简单的方法是使用UNION
  • @jbarker2160 你能举个例子吗?
  • This 是一个很好的资源。
  • @jbarker2160 我知道如何使用 SQL 联合 - 我将如何使用它为我的查询生成总行?
  • @BigPimpin 好的,现在您需要将 select * 中的列放在聚合函数或分组中 - 请参阅 msdn 文档 - technet.microsoft.com/en-us/library/bb522495(v=sql.105).aspx

标签: sql-server-2008 pivot cube


【解决方案1】:

具有聚合行的 UNION ALL 将向您显示带有 SUM 的原始透视数据

WITH data AS (
    select *
    FROM
    (
      select case 
      WHEN a.state LIKE 'CA' THEN 'California'
      WHEN a.state LIKE 'WA' THEN 'Washington'
      else a.state
      end As [Full State], 
      SaleID As [Sales By State], 
      CONVERT(VARCHAR(20), dt.CumulativeWeek) AS Week
      FROM retailsales.Store1 a
      INNER JOIN retailsales.customCalendar dt
      ON a.orderDate = dt.orderDate
      WHERE a.orderDate IS NOT NULL
      GROUP BY CUBE (SaleID, state, dt.CumulativeWeek)
    ) src
    pivot
    (
      COUNT([Sales By State])
      For Week IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])
    ) piv
)
SELECT [Full State]
     , [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13]
FROM   data
UNION ALL
SELECT ''
     , SUM([1]),SUM([2]),SUM([3]),SUM([4]),SUM([5]),SUM([6])
     , SUM([7]),SUM([8]),SUM([9]),SUM([10]),SUM([11]),SUM([12]),SUM([13])
FROM   data

【讨论】:

  • 谢谢!我尝试执行此操作,但收到 Invalid column name 'Week' 的错误。 -- 它在 Select [Full State],Week 行下划线
  • 这应该将 Week 列定义为 CONVERT(VARCHAR(20), dt.CumulativeWeek) AS Week。那改变了吗?
  • 不。那条线没有改变。仅在该选择中使用枢轴中的 Week 没有问题
  • 我刚刚更新了解决方案以从结果中排除 Week 列。我什至没有注意到那个领域正在被旋转。我应该抓住它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多