使用Derby SQL计算直方图值 统计各SKU数对应周转箱频次
Derby实现周转箱SKU数量直方图统计
现有基础信息
- 业务表:
totecontents,存储周转箱与SKU的存放对应关系- 字段
ToteID:周转箱唯一标识 - 字段
SKU:库存保有单位编号
- 字段
- 业务规则:单个周转箱最多存放6个SKU
- 单箱SKU数查询基础语句:
select toteid, count(*) as qtypertote from totecontents group by toteid;
需求说明
需要返回直方图专用统计结果,包含两列:
SkuCount:1到6的整数,代表单个周转箱内存放的SKU数量Occurences:对应该SKU数量的周转箱总次数,计数为0的SkuCount也必须展示对应行
原有尝试的嵌套分组语句存在缺陷:仅会返回实际存在的SKU计数对应的结果,缺失0计数行,无法满足需求。
正确实现SQL
Derby没有内置生成连续序列的函数,因此通过虚表sysibm.sysdummy1手动构造1-6的固定序列,再左关联实际统计结果,保证0计数行不丢失:
SELECT seq.SkuCount, COALESCE(stat.Occurences, 0) AS Occurences FROM ( -- 生成1-6的连续SkuCount序列 SELECT 1 AS SkuCount FROM sysibm.sysdummy1 UNION ALL SELECT 2 FROM sysibm.sysdummy1 UNION ALL SELECT 3 FROM sysibm.sysdummy1 UNION ALL SELECT 4 FROM sysibm.sysdummy1 UNION ALL SELECT 5 FROM sysibm.sysdummy1 UNION ALL SELECT 6 FROM sysibm.sysdummy1 ) seq LEFT JOIN ( -- 统计实际存在的各SKU数对应的周转箱量 SELECT qtypertote AS SkuCount, COUNT(*) AS Occurences FROM ( SELECT ToteID, COUNT(*) AS qtypertote FROM totecontents GROUP BY ToteID ) tote_stat GROUP BY qtypertote ) stat ON seq.SkuCount = stat.SkuCount ORDER BY seq.SkuCount;
逻辑说明
- 用
UNION ALL搭配Derby内置虚表生成1-6的固定枚举值,不需要依赖额外业务表 - 左连接(
LEFT JOIN)保证1-6的每个SkuCount都会出现在最终结果里,不会因为实际没有对应周转箱就丢失行 COALESCE函数将关联不到数据产生的空值转换为0,符合0计数展示要求
内容的提问来源于stack exchange,提问作者linlai
相关产品推荐
相关产品推荐

