如何编写SQL查询按日期分组求和指定两类DPD余额数据?
问题分析与解决方案
数据表示例
| 指标(Metric) | 分数区间(Score Range) | 日期(Date) | 数值(value) |
|---|---|---|---|
| 30 DPD | 530-579 | Apr-17 | 42.5 |
| 60 DPD | 580-619 | Oct-18 | 60.5 |
你的核心需求是:新增一列,计算**分数区间为'530-579'**的30 DPD与60 DPD的数值之和,并按日期(PRD_END_DATE)分组。现有代码的问题在于SELECT列与GROUP BY不匹配,且没有实现“新增列”的需求,以下是两种场景的解决方案:
场景1:保留原始数据行,新增合计列
如果需要保留每一行的原始信息,同时新增列展示对应日期下符合条件的数值总和,使用窗口函数实现:
SELECT PRODUCT, METRIC, SCORE, PRD_END_DATE, value, -- 按日期分组,仅计算分数区间530-579的30/60 DPD数值之和 SUM(CASE WHEN SCORE = '530-579' AND METRIC IN ('30 DPD', '60 DPD') THEN value ELSE 0 END) OVER (PARTITION BY PRD_END_DATE) AS total_30_60_dpd_530_579 FROM INDUSTRY -- 可选:如果只关注这两类指标,保留WHERE条件 WHERE METRIC IN ('30 DPD', '60 DPD')
场景2:仅按日期分组展示合计结果
如果只需要按日期聚合后的总和,调整分组逻辑确保语法合规:
SELECT PRD_END_DATE, SUM(value) AS total_30_60_dpd_530_579 FROM INDUSTRY WHERE METRIC IN ('30 DPD', '60 DPD') AND SCORE = '530-579' GROUP BY PRD_END_DATE
关键说明
- 场景1的窗口函数
SUM() OVER (PARTITION BY PRD_END_DATE)可以在不改变原始行结构的前提下,计算每个日期分组的目标总和; CASE WHEN用来精准筛选符合分数区间和指标类型的数据,排除无关行的干扰;- 场景2是标准分组聚合,确保
SELECT中的列要么在GROUP BY中,要么是聚合函数的结果,避免语法错误。
内容的提问来源于stack exchange,提问作者Abdullah Khan
相关产品推荐
相关产品推荐

