【问题标题】:multiple pivot on same column in tsqlsql中同一列的多个pivot
【发布时间】:2019-06-11 11:19:55
【问题描述】:

如何在 tsql 中的同一列上定义数据透视?

例如:

 SELECT * FROM (
 SELECT CAST(start_time AS DATE) AS [Date],
 DATEPART(hour,start_time) AS [Hour], 
 Count(is_sale)AS  [Sales Count] 
 ,Count(is_not_sale)AS  [No Sales Count] 
 FROM  prov_sales WITH(NOLOCK)
 GROUP BY CAST(start_time AS DATE), DATEPART(hour,start_time)) AS HourlySalesData

 PIVOT( SUM([Sales Count]) FOR [Hour] IN ([0], [1], [2], [3], [4], [5], [6], [7],
     [8], [9], [10],[11], [12], [13], [14], [15], [16], 
     [17], [18], [19], [20], [21], [22], [23])) AS DatePivot1

 PIVOT( SUM([No Sales Count]) FOR [Hour] IN ([0], [1], [2], [3], [4], [5], [6], [7],
     [8], [9], [10],[11], [12], [13], [14], [15], [16], 
     [17], [18], [19], [20], [21], [22], [23])) AS DatePivot2

我上面的 tsql 无法正常工作,因为小时列的值从 [1] 到 [23] 重复出现错误。

【问题讨论】:

  • 没有样本数据和预期结果,我们不能只在这里猜测,但我更喜欢使用交叉表而不是 PIVOT 运算符的一个原因是因为您不需要使用 PIVOT多个枢轴不止一次。另外,换个说法,为什么要WITH(NOLOCK)?我假设您了解使用它的含义,对吗?
  • 谢谢你让我探索交叉表。

标签: sql-server tsql pivot


【解决方案1】:

当 PIVOT 从 IN 列表中创建列名时,您不能像 [1] 那样定义同一列两次。虽然以下解决方案不是标准解决方案,但它可能符合您的目的-

SELECT * FROM (
SELECT CAST(start_time AS DATE) AS [Date],
--Created the hour column twice for Pivoting twice
'Sales_' + CAST(DATEPART(hour,start_time) AS VARCHAR) AS [Hour_Sales], 
'NoSales_' + CAST(DATEPART(hour,start_time) AS VARCHAR) AS [Hour_NoSales], 
Count(is_sale)AS  [Sales Count] 
,Count(is_not_sale)AS  [No Sales Count] 
FROM  prov_sales WITH(NOLOCK)
GROUP BY CAST(start_time AS DATE), DATEPART(hour,start_time)) AS HourlySalesData

PIVOT( SUM([Sales Count]) FOR [Hour_Sales] IN ([Sales_0], [Sales_1], [Sales_2], [Sales_3], [Sales_4], [Sales_5], [Sales_6], [Sales_7],
     [Sales_8], [Sales_9], [Sales_10],[Sales_11], [Sales_12], [Sales_13], [Sales_14], [Sales_15], [Sales_16], 
     [Sales_17], [Sales_18], [Sales_19], [Sales_20], [Sales_21], [Sales_22], [Sales_23])) AS DatePivot1

PIVOT( SUM([No Sales Count]) FOR [Hour_NoSales] IN ([NoSales_0], [NoSales_1], [NoSales_2], [NoSales_3], [NoSales_4], [NoSales_5], [NoSales_6], [NoSales_7],
     [NoSales_8], [NoSales_9], [NoSales_10],[NoSales_11], [NoSales_12], [NoSales_13], [NoSales_14], [NoSales_15], [NoSales_16], 
     [NoSales_17], [NoSales_18], [NoSales_19], [NoSales_20], [NoSales_21], [NoSales_22], [NoSales_23])) AS DatePivot2

【讨论】:

  • 我的所有列在 [1]-[23] 的每一行 sales 和 nosales 中都是相同的
  • 这就是为什么我为它们添加前缀 Sales_ 和 NoSales_ 以获得预期的输出。当然,列名会与您的预期不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多