如何使用数据透视表进行分组

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

【讨论】:

拯救我的一天!感谢您的帮助。

以上是关于如何使用数据透视表进行分组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL/MariaDB 如何实现数据透视表

Excel 数据透视表:在分组数据透视表中添加单列

Sql Server 数据透视表未对结果集进行分组

使用 Excel 数据透视表作为另一个数据透视表的数据源

Python数据分析pandas之分组统计透视表

快速入门pandas进行数据挖掘数据分析[多维度排序数据筛选分组计算透视表]