如何使用数据透视表进行分组
Posted
技术标签:
【中文标题】如何使用数据透视表进行分组【英文标题】:How to group by using pivot table 【发布时间】:2019-08-16 07:39:51 【问题描述】:有一张这样的桌子:,
name ZK04_COUNT ZK05_COUNT ZK04_PRICE ZK05_PRICE
A 15 0 150.00 0
A 0 20 0 223.00
B 11 0 75.00 0
B 0 24 0 250.00
我正在尝试将其转换为这样的内容:
name ZK04_COUNT ZK05_COUNT ZK04_PRICE ZK05_PRICE
A 15 20 150.00 223.00
B 11 24 75.00 250.00
我的代码是这样的:
SELECT *
FROM (
SELECT
r.name
,r.AUART
, CASE WHEN r.AUART = 'ZK05' THEN count(r.MATNR) ELSE '' END AS ZK05_COUNT
, CASE WHEN r.AUART = 'ZK04' THEN count(r.MATNR) ELSE '' END AS ZK04_COUNT
, CONVERT(money, sum(CAST(netpr as MONEY)), 1) as ToplamTutar
FROM GARANTI_YP_RAPORU as r
group by r.name ,r.AUART
) as gTablo
PIVOT
(
SUM(ToplamTutar)
FOR gTablo.AUART IN ([ZK05],[ZK04])
)
AS p1
我希望输出为单行。怎么能这样?
【问题讨论】:
@jarlh SQL server 2014 管理工作室 向我们展示 original 表会有助于您的问题。试图仅根据当前输出找出可能是什么是困难的。 似乎枢轴不是一个好的选择。当您希望将特定列的值转换为列时,通常使用 PIVOT,但情况并非如此。正如 Luk 所回答的那样,您可以使用GROUP BY
做您需要的事情。
【参考方案1】:
这并不需要 PIVOT。 仅按名称对它们进行分组,然后使用条件聚合应该可以。
SELECT r.name
, COUNT(CASE WHEN r.AUART = 'ZK04' THEN r.MATNR END) AS ZK04_COUNT
, COUNT(CASE WHEN r.AUART = 'ZK05' THEN r.MATNR END) AS ZK05_COUNT
, CAST(SUM(CASE WHEN r.AUART = 'ZK04' THEN r.netpr ELSE 0 END) AS MONEY) AS ZK04_PRICE
, CAST(SUM(CASE WHEN r.AUART = 'ZK05' THEN r.netpr ELSE 0 END) AS MONEY) AS ZK05_PRICE
FROM GARANTI_YP_RAPORU as r
GROUP BY r.name
ORDER BY r.name
【讨论】:
拯救我的一天!感谢您的帮助。以上是关于如何使用数据透视表进行分组的主要内容,如果未能解决你的问题,请参考以下文章