如何在多条件查询中按部门统计各指定物品的使用数量?
按部门统计指定物品单独使用数量的SQL实现方案
根据你的三张表结构,这里提供两种常用的实现方式,满足不同的展示需求:
方式一:行式统计(每个部门+物品组合一行)
这种方式会将每个部门的每个指定物品的使用数量单独成一行,适合需要详细查看每个物品数据的场景。
SELECT cu.UNITDSC AS 部门名称, cr.ITEMCODE AS 物品编码, cr.ITEMDESC AS 物品名称, COUNT(cr.BILLNO) AS 使用数量 FROM CAFTRXHD cr JOIN STAFF s ON cr.EMPID = s.EMPID JOIN CAFUNIT cu ON s.UNITCTR = cu.UNITCTR WHERE cr.ITEMCODE BETWEEN '397' AND '403' -- 若ITEMCODE为数字类型,移除单引号 GROUP BY cu.UNITDSC, cr.ITEMCODE, cr.ITEMDESC ORDER BY cu.UNITDSC, cr.ITEMCODE;
说明
- 通过关联三张表,将交易记录关联到所属部门;
- 过滤出
ITEMCODE在397-403范围内的记录; - 按部门名称、物品编码、物品名称分组,用
COUNT统计每个分组的使用次数; - 如果
CAFTRXHD表中有专门的物品数量字段(如ITEMQTY),将COUNT(cr.BILLNO)替换为SUM(cr.ITEMQTY)即可统计实际数量。
方式二:列式统计(每个部门一行,物品数量列展示)
这种方式会将每个部门的所有指定物品数量放在同一行的不同列中,适合报表类的紧凑展示需求。
SELECT cu.UNITDSC AS 部门名称, SUM(CASE WHEN cr.ITEMCODE = '397' THEN 1 ELSE 0 END) AS 物品397使用数量, SUM(CASE WHEN cr.ITEMCODE = '398' THEN 1 ELSE 0 END) AS 物品398使用数量, SUM(CASE WHEN cr.ITEMCODE = '399' THEN 1 ELSE 0 END) AS 物品399使用数量, SUM(CASE WHEN cr.ITEMCODE = '400' THEN 1 ELSE 0 END) AS 物品400使用数量, SUM(CASE WHEN cr.ITEMCODE = '401' THEN 1 ELSE 0 END) AS 物品401使用数量, SUM(CASE WHEN cr.ITEMCODE = '402' THEN 1 ELSE 0 END) AS 物品402使用数量, SUM(CASE WHEN cr.ITEMCODE = '403' THEN 1 ELSE 0 END) AS 物品403使用数量 FROM CAFTRXHD cr JOIN STAFF s ON cr.EMPID = s.EMPID JOIN CAFUNIT cu ON s.UNITCTR = cu.UNITCTR WHERE cr.ITEMCODE BETWEEN '397' AND '403' GROUP BY cu.UNITDSC ORDER BY cu.UNITDSC;
说明
- 使用
CASE表达式对每个物品编码单独判断,符合条件则计数1,否则0; - 用
SUM汇总每个部门对应物品的总使用次数; - 同样,若有物品数量字段,将
1替换为对应的数量字段即可。
注意事项
- 数据类型匹配:确认
ITEMCODE是字符串还是数字类型,调整SQL中的单引号; - 空值处理:如果需要包含从未使用过指定物品的部门,将
JOIN替换为LEFT JOIN,并可用COALESCE函数将NULL转为0; - 去重需求:若
CAFTRXHD存在重复的BILLNO记录,使用COUNT(DISTINCT cr.BILLNO)代替COUNT(cr.BILLNO)避免重复统计。
内容的提问来源于stack exchange,提问作者user10191234
相关产品推荐
相关产品推荐

