SQL需求:将ROLLUP汇总的Null替换为Grand Total并筛选2018年交易
解决ROLLUP汇总与2018年交易过滤的SQL问题
Let's fix your query to meet both requirements clearly:
1. 过滤2018年的交易
要仅查询2018年处理的交易,我们可以在WHERE子句中通过年份判断来筛选数据。这里有两种常用方式:
方式一:使用YEAR()函数
直接提取TRANSACTION_DATE的年份进行匹配,写法简洁直观:
WHERE YEAR(TRANSACTION_DATE) = 2018
方式二:使用日期范围(推荐)
如果TRANSACTION_DATE字段建有索引,这种方式通常更高效——数据库可以直接利用索引做范围扫描,避免全表遍历:
WHERE TRANSACTION_DATE BETWEEN '2018-01-01' AND '2018-12-31 23:59:59'
2. 将ROLLUP汇总行的null替换为Grand Total
ROLLUP生成的汇总行中,分组字段会显示为null,我们可以用两个函数轻松替换这个值:
COALESCE():返回第一个非null的参数,刚好适配汇总行的替换场景IF():通过条件判断直接指定替换逻辑
完整的SQL语句
结合以上两点,最终的查询语句如下(两种写法任选其一即可):
用COALESCE()的版本
SELECT COALESCE(DATE_FORMAT(TRANSACTION_DATE, '%M'), 'Grand Total') AS MONTH, SUM(SALES_AMOUNT) AS TOTAL FROM SALES WHERE TRANSACTION_DATE BETWEEN '2018-01-01' AND '2018-12-31 23:59:59' GROUP BY DATE_FORMAT(TRANSACTION_DATE, '%M') WITH ROLLUP;
用IF()的版本
SELECT IF(DATE_FORMAT(TRANSACTION_DATE, '%M') IS NULL, 'Grand Total', DATE_FORMAT(TRANSACTION_DATE, '%M')) AS MONTH, SUM(SALES_AMOUNT) AS TOTAL FROM SALES WHERE YEAR(TRANSACTION_DATE) = 2018 GROUP BY DATE_FORMAT(TRANSACTION_DATE, '%M') WITH ROLLUP;
预期执行结果
执行后,汇总行的null会被替换为Grand Total,且只包含2018年的交易数据,结果类似:
January 160.00
June 100.00
May 240.00
Grand Total 500.00
内容的提问来源于stack exchange,提问作者TBERMINGHAM
相关产品推荐
相关产品推荐

