如何使用数据透视并拥有 2 个不同的聚合函数?

Posted

技术标签:

【中文标题】如何使用数据透视并拥有 2 个不同的聚合函数?【英文标题】:How to use pivot and have 2 different aggregate functions? 【发布时间】:2016-04-01 09:05:10 【问题描述】:

我有一个包含 1 个日期列的表格。我想按年和月对日期进行分组,这样我就有了一个矩阵,例如:

Year Jan Feb Mar...Dec Total
2015.....
2016  10  15  10... 10   115
2017.....

这是否可以使用PIVOT函数来实现,我究竟如何使用它来实现上述?

【问题讨论】:

【参考方案1】:

你可以在没有 PIVOT 的情况下实现

SELECT
   DATEPART(yyyy,t.the_date) as year,
   SUM(CASE WHEN DATEPART(mm,t.the_date)=1 THEN 1 ELSE 0 END) as Jan,
   SUM(CASE WHEN DATEPART(mm,t.the_date)=2 THEN 1 ELSE 0 END) as Feb,
...
   SUM(CASE WHEN DATEPART(mm,t.the_date)=12 THEN 1 ELSE 0 END) as Dec,
   COUNT(*) as Total
FROM the_table t
GROUP BY DATEPART(yyyy,t.the_date)

【讨论】:

这也有效。是否仍然可以使用PIVOT 进行这样的查询,并且它的性能是否比GROUP BY 更好。【参考方案2】:

尝试使用这个查询:-

SELECT *
    FROM (
        SELECT 
            year(yourDate) as [year],left(datename(month,yourDate),3)as [month], 
            Amount 
        FROM YourTableName
    ) as s
    PIVOT
    (
        SUM(Amount)
        FOR [month] IN (jan, feb, mar, apr, 
        may, jun, jul, aug, sep, oct, nov, dec)
    )AS pvt

【讨论】:

以上是关于如何使用数据透视并拥有 2 个不同的聚合函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中不进行聚合的数据透视

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

在数据透视聚合函数中使用CONCAT函数的SQL Server错误

数据透视表中聚合函数的必要性是啥

如何在 oracle 数据库中为具有复杂聚合的数据透视编写等效的 sql 查询?

没有聚合函数的 SQL Server 数据透视查询