Firebird环境下SQL实现按用户统计奖励数量及各奖励最后获取日期
Firebird SQL查询:按用户统计奖励数量及最后获取日期
要实现你需要的统计效果,我们可以用条件聚合的方式——在聚合函数中结合CASE语句,针对不同奖励类型分别计算数量和最后日期,完美适配Firebird的SQL语法。
完整SQL查询语句
SELECT NAME, COUNT(CASE WHEN REWARD = 'big' THEN 1 END) AS BIG_REWARDS, COUNT(CASE WHEN REWARD = 'small' THEN 1 END) AS SMALL_REWARDS, MAX(CASE WHEN REWARD = 'big' THEN DATE END) AS LAST_BIG_REWARD, MAX(CASE WHEN REWARD = 'small' THEN DATE END) AS LAST_SMALL_REWARD FROM YOUR_TABLE_NAME -- 替换成你的实际表名 GROUP BY NAME ORDER BY NAME;
代码解释
- 分组基础:通过
GROUP BY NAME确保我们按每个用户单独统计 - 奖励数量统计:
COUNT(CASE WHEN REWARD = 'big' THEN 1 END):当奖励类型为big时返回1,否则返回NULL;COUNT函数会自动忽略NULL值,最终得到该用户的大奖励总数- 小奖励数量的统计逻辑完全一致,只需把条件换成
REWARD = 'small'
- 最后奖励日期:
MAX(CASE WHEN REWARD = 'big' THEN DATE END):针对大奖励的记录取最大的日期值,也就是最后一次获取大奖励的日期- 小奖励的最后日期同理,替换条件即可;如果用户没有该类型的奖励,会返回
NULL(和你预期的结果格式一致)
执行结果
执行后会得到你需要的宽表格式结果:
| NAME | BIG_REWARDS | SMALL_REWARDS | LAST_BIG_REWARD | LAST_SMALL_REWARD |
|---|---|---|---|---|
| Chris | 1 | 2 | 01.07.2014 | 27.08.2015 |
| Tom | 2 | 0 | 30.11.2017 |
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

