在聚合查询中如何统计匹配筛选条件的行数
解决方案:按日聚合总Qty并统计Type B的行数
你想要的是在同一个分组查询里同时拿到两个聚合结果——每日的总qty,以及当日type为B的记录条数,这用条件聚合就能轻松实现,不用复杂的子查询或者关联操作。
给你写个直接适配你表结构的完整SQL示例:
SELECT date_trunc('day', date) AS day, SUM(qty) AS total_daily_qty, COUNT(CASE WHEN type = 'B' THEN 1 END) AS count_type_b FROM your_table_name -- 这里替换成你的实际表名 GROUP BY date_trunc('day', date) ORDER BY day;
代码细节解释:
date_trunc('day', date):把datetime类型的date字段截断到“日”维度,确保同一天的所有记录会被归到同一分组里。SUM(qty):直接计算当日所有记录的qty总和,就是你需要的当日总qty。COUNT(CASE WHEN type = 'B' THEN 1 END):通过CASE语句筛选出type为B的记录,符合条件的返回1,不符合的返回NULL;而COUNT函数会自动忽略NULL值,最终统计的就是当日type为B的行数。(你也可以用SUM(CASE WHEN type = 'B' THEN 1 ELSE 0 END),效果完全一致)
用你的测试数据执行后,结果会是这样:
| day | total_daily_qty | count_type_b |
|---|---|---|
| 2018-03-21 | 3 | 0 |
| 2018-03-22 | 7 | 1 |
如果需要按月统计,只需要把date_trunc('day', date)改成date_trunc('month', date)即可,其他部分无需调整。
内容的提问来源于stack exchange,提问作者balsick




