如何使用聚合函数将SQL表字段值转为查询结果的表头
SQL行转列查询方案
你需要实现的是典型的行转列(透视表)统计需求,不同数据库的实现语法略有区别,以下是通用兼容写法和各主流数据库的适配方案:
通用CASE WHEN写法(兼容所有主流SQL数据库)
这种写法不依赖数据库特有函数,MySQL、PostgreSQL、SQL Server、Oracle都可以直接运行:
SELECT Date, SUM(CASE WHEN type = 'Cash' THEN amount ELSE 0 END) AS Cash, SUM(CASE WHEN type = 'Google Pay' THEN amount ELSE 0 END) AS `Google Pay` FROM sales_table GROUP BY Date ORDER BY Date;
语法说明
- 用
CASE WHEN判断每条记录的支付类型,匹配上就返回对应金额,不匹配返回0,避免聚合统计时出现空值 - 对判断后的结果用
SUM聚合,得到同日期同类型的总金额 - 如果type值包含空格(比如
Google Pay),需要用对应数据库的转义符包裹别名:MySQL用反引号、SQL Server用方括号、Oracle用双引号
各数据库特有简化写法
- MySQL:可以用
IF函数简化判断逻辑
SELECT Date, SUM(IF(type = 'Cash', amount, 0)) AS Cash, SUM(IF(type = 'Google Pay', amount, 0)) AS `Google Pay` FROM sales_table GROUP BY Date ORDER BY Date;
- SQL Server:可以用
PIVOT关键字实现透视
SELECT Date, Cash, [Google Pay] FROM ( SELECT Date, type, amount FROM sales_table ) AS source PIVOT ( SUM(amount) FOR type IN (Cash, [Google Pay]) ) AS pivot_table ORDER BY Date;
- PostgreSQL:可以用
FILTER子句简化条件聚合
SELECT Date, SUM(amount) FILTER (WHERE type = 'Cash') AS Cash, SUM(amount) FILTER (WHERE type = 'Google Pay') AS "Google Pay" FROM sales_table GROUP BY Date ORDER BY Date;
执行符合你数据库环境的语句后,就可以得到预期结果:
| Date | Cash | Google Pay |
|---|---|---|
| 2021-12-01 | 100 | 500 |
| 2021-12-02 | 100 | 400 |
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

