【发布时间】:2014-12-30 14:43:35
【问题描述】:
我很想知道我是否可以像这样在 sql server 的同一列上执行多个 PIVOT:
WITH T(ID, NAME, MSNAME, PLANED, ACTUAL)
AS (
SELECT 1, '45rpm', 'Raised to Supplier', '2014-12-17', '2015-12-17' UNION ALL
SELECT 1, '45rpm', 'Base Test Date', '2014-12-18', '2015-12-18' UNION ALL
SELECT 1, '45rpm', 'Washing Approval', '2014-12-19', '2015-12-19'
)
SELECT ID, NAME
, MAX(CASE WHEN MSNAME LIKE 'Raised to Supplier' THEN PLANED END) AS 'Raised to Supplier (PLANED)'
, MAX(CASE WHEN MSNAME LIKE 'Base Test Date' THEN PLANED END) AS 'Base Test Date (PLANED)'
, MAX(CASE WHEN MSNAME LIKE 'Washing Approval' THEN PLANED END) AS 'Washing Approval (PLANED)'
, MAX(CASE WHEN MSNAME LIKE 'Raised to Supplier' THEN ACTUAL END) AS 'Raised to Supplier (ACTUAL)'
, MAX(CASE WHEN MSNAME LIKE 'Base Test Date' THEN ACTUAL END) AS 'Base Test Date (ACTUAL)'
, MAX(CASE WHEN MSNAME LIKE 'Washing Approval' THEN ACTUAL END) AS 'Washing Approval (ACTUAL)'
FROM T
GROUP BY ID, NAME
对于PLANED 列,它运行良好,但我无法添加第二列ACTUAL(如上例所示↑)
WITH T(ID, NAME, MSNAME, PLANED, ACTUAL)
AS (
SELECT 1, '45rpm', 'Raised to Supplier', '2014-12-17', '2015-12-17' UNION ALL
SELECT 1, '45rpm', 'Base Test Date', '2014-12-18', '2015-12-18' UNION ALL
SELECT 1, '45rpm', 'Washing Approval', '2014-12-19', '2015-12-19'
)
SELECT ID, NAME
, MAX([Raised to Supplier]) AS 'Raised to Supplier (PLANED)'
, MAX([Base Test Date]) AS 'Base Test Date (PLANED)'
, MAX([Washing Approval]) AS 'Washing Approval (PLANED)' FROM T
PIVOT
(
max(PLANED)
FOR MSNAME IN ([Raised to Supplier],[Base Test Date],[Washing Approval])
) AS p1
GROUP BY ID, NAME
编辑:
PIVOT 关键字的限制很少,其中一个已在此处讨论过,即 SQL 服务器不支持 PIVOT 中的多重聚合 - Giorgos 评论说 [类似于 PIVOT (min(), max(), sum() ...)]
有 3 种替代方法可以应对这种情况:
- 不带 PIVOT 关键字的 case 语句的一般解决方案(如上面的第一个示例所示)
- 首先取消透视数据,然后对它们进行透视(在聚合之前增加行并合并列)[@bluefeet 回答]
- 复制列以进行第二次聚合[@NoDisplayName 回答]
了解后我认为这个问题的标题应该是:单个 PIVOT() 中的多个聚合而不是现有的一个
【问题讨论】:
-
好吧,你试试怎么样?
-
TSQL 不支持 PIVOT 中的多个聚合。
-
很难选择任何一个答案。
@NoDisplayName和@bluefeet都展示了他们的创造力,我测试的两个答案都正常工作。是时候让我“Eeny, meeny, miny, moe”了
标签: sql sql-server pivot