Oracle 12中按用户统计各产品数量及总数的SQL实现咨询
嘿,这个需求用Oracle的条件聚合就能完美解决,我之前处理过不少类似的行转列统计场景,直接给你上可运行的方案:
核心实现方案
在Oracle 12c中,通过CASE WHEN配合聚合函数,就能把原来按行存储的产品数据,转换成按列统计的结果,完全匹配你要的输出格式。
完整可执行SQL
SELECT name, -- 统计tea的数量:仅当product为tea时计数,否则忽略 COUNT(CASE WHEN product = 'tea' THEN 1 END) AS count_tea, -- 统计beer的数量 COUNT(CASE WHEN product = 'beer' THEN 1 END) AS count_beer, -- 统计milk的数量 COUNT(CASE WHEN product = 'milk' THEN 1 END) AS count_milk, -- 统计总记录数 COUNT(*) AS count_total FROM your_table_name -- 记得替换成你的实际表名哦 GROUP BY name ORDER BY name;
逻辑拆解(新手也能懂)
- 条件计数原理:
COUNT()函数只会统计非NULL的值,当product不等于目标值时,CASE语句返回NULL,不会被计入统计,正好得到对应产品的精准数量。 - 分组聚合:
GROUP BY name确保我们是按每个用户来汇总数据,不会把不同用户的统计混在一起。 - 总计数:
COUNT(*)直接统计当前用户的所有记录数,比把三个产品数量加起来更高效。
可选:用Oracle专属函数简化写法
如果你熟悉Oracle的DECODE函数,也可以用它替代CASE WHEN,代码更简洁,效果完全一致:
SELECT name, COUNT(DECODE(product, 'tea', 1)) AS count_tea, COUNT(DECODE(product, 'beer', 1)) AS count_beer, COUNT(DECODE(product, 'milk', 1)) AS count_milk, COUNT(*) AS count_total FROM your_table_name GROUP BY name ORDER BY name;
验证结果
执行后会输出和你要求完全一致的统计表格:
| name | count_tea | count_beer | count_milk | count_total |
|---|---|---|---|---|
| john | 1 | 3 | 1 | 5 |
| emily | 1 | 0 | 2 | 3 |
内容的提问来源于stack exchange,提问作者Viktor Forrai
相关产品推荐
相关产品推荐

