You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:32