SQL Server 数据透视 + 总和 + 分组依据

Posted

技术标签:

【中文标题】SQL Server 数据透视 + 总和 + 分组依据【英文标题】:SQL server pivot + sum + group by 【发布时间】:2021-03-28 01:30:57 【问题描述】:

我有以下数据,我需要对 sum pivot 进行分组

AA BB date
a 1 01/01/2020
a 2 01/01/2020
b 5 01/01/2020
b 1 01/01/2020
c 5 01/01/2020
d 1 01/01/2020
d 8 02/01/2020
e 1 01/01/2020

我用我的 sql 代码得到的东西

a b c d e
01/01/2020 3 6 5 1 1
02/01/2020 / / / 8 /

我需要得到:a 和 d 分组为 f 和 c 和 e 分组为 g 和 b 分开

b f g
01/01/2020 6 4 6
02/01/2020 / 8 /

我有以下 sql,但我似乎无法进行分组求和。你是在旋转之前还是之后?

SELECT * FROM(
SELECT AA,Date
FROM [dbo].[Data] )
AS SourceTable 
PIVOT(SUM([BB]) 
FOR [AA] IN([a],[b],[c],[d],[e])) 
AS PivotTable 

如果我尝试这个它不起作用

SELECT * FROM(
SELECT AA,Date
FROM [dbo].[Data] )
AS SourceTable 
PIVOT(SUM([BB]) 
FOR [AA] IN([a]+[d],[b],[c]+[e])) 
AS PivotTable 

【问题讨论】:

【参考方案1】:

使用条件聚合如下:

select sum(case when aa in ('a','d') then BB  end) as f,
       sum(case when aa in ('c','e') then BB  end) as g,
       sum(case when aa = 'b' then BB  end) as b
  from table_name
group by date

【讨论】:

【参考方案2】:

我发现使用条件聚合更简单:

select 
    date,
    sum(case when d.aa = 'b'         then bb else 0 end) as b,
    sum(case when d.aa in ('a', 'd') then bb else 0 end) as f,
    sum(case when d.aa in ('c', 'e') then bb else 0 end) as g
from data d
group by date

【讨论】:

以上是关于SQL Server 数据透视 + 总和 + 分组依据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 - 在没有总和/计数和动态值列表的情况下透视数据

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

在 SQL Server 中使用逐行总和进行透视[关闭]

动态 SQL 透视查询中的分组和聚合函数

SQL Server进阶查询

php sql中带有日期、变量类别和总和值的数据透视表