按ID与月份分区,满足Cat='low'时计算Hours×WorkingDaysInMonth聚合值的SQL问题
符合需求的SQL实现方案
没问题,这就帮你修正SQL来实现需求:你需要在窗口函数的聚合逻辑里加入条件判断,只对Cat='low'的行计算Hours×WorkingDaysInMonth的乘积并求和,同时保持按ID和Month分区的逻辑。这里用CASE WHEN就能完美实现这个过滤:
修正后的完整SQL
SELECT ID, Hours, Cat, Month, WorkingDaysInMonth, SUM(CASE WHEN Cat = 'low' THEN Hours * WorkingDaysInMonth ELSE 0 END) OVER (PARTITION BY ID, Month) AS TESTING FROM TABLEA;
关键逻辑说明
- 条件过滤:通过
CASE WHEN Cat = 'low' THEN Hours * WorkingDaysInMonth ELSE 0 END,仅当Cat为low时计算乘积,非目标行返回0(不会影响SUM的最终结果);如果你希望非目标行的TESTING字段显示为NULL,可以把ELSE 0改成ELSE NULL,SUM会自动忽略NULL值,最终聚合结果一致。 - 分区保持:保留你原有的
PARTITION BY ID, Month,确保每个ID+Month的分组下单独计算聚合值。
示例验证
假设你的TABLEA有以下数据:
| ID | Hours | Cat | Month | WorkingDaysInMonth |
|---|---|---|---|---|
| 1 | 50 | low | 201803 | 20 |
| 1 | 35 | low | 201803 | 20 |
| 1 | 40 | high | 201803 | 20 |
| 2 | 25 | low | 201804 | 22 |
运行上述SQL后,TESTING列的结果会是:
| ID | Hours | Cat | Month | WorkingDaysInMonth | TESTING |
|---|---|---|---|---|---|
| 1 | 50 | low | 201803 | 20 | 1700 |
| 1 | 35 | low | 201803 | 20 | 1700 |
| 1 | 40 | high | 201803 | 20 | 1700 |
| 2 | 25 | low | 201804 | 22 | 550 |
可以看到,只有Cat='low'的行参与了聚合计算,且同一ID+Month分组下的所有行都显示相同的聚合结果,完全符合你的需求。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

