You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

验证结果

执行后会输出和你要求完全一致的统计表格:

namecount_teacount_beercount_milkcount_total
john1315
emily1023

内容的提问来源于stack exchange,提问作者Viktor Forrai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:57:46