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

SQL需求:基于Location列拆分Qty求和,仅保留存在Storage的物品

SQL查询问题:筛选存在Storage位置的物品并统计数量

需求

  • 仅列出存在Storage位置记录的物品
  • 统计每个物品在Storage和Active位置的Qty总和
  • 排除不在Storage/Active位置的物品(如示例中的ItemC)

数据集示例

IDItemLocationQty
1ItemAStorage4
2ItemAActive9
3ItemBStorage3
4ItemBStorage2
5ItemAActive1
6ItemCBoxed3
7ItemDActive1
8ItemDStorage1

预期结果

ItemStorageActive
ItemA410
ItemB50
ItemD11

错误尝试代码及问题

尝试的SQL代码:

SELECT 
    ITEMDESC.A, 
    SUM(CASE WHEN LOCATION.A='Storage' THEN QTY.A ELSE 0 END), 
    SUM(CASE WHEN LOCATION.B='Active'  THEN QTY.B ELSE 0 END)
 FROM       
    ITEMS A, ITEMS B
 INNER JOIN     
    ITEMDESC.A = ITEMDESC.B
 WHERE       
 GROUP BY   
    ITEMDESC.A

遇到的问题:

  • 该查询返回所有物品,不符合筛选要求
  • 添加WHERE Location.B = 'Storage'后,仅能统计Storage的数量,Active数量全部为0,无法得到正确结果

正确SQL写法及说明

实现思路

  1. 先过滤掉无关位置的记录(仅保留Storage和Active),提升查询效率
  2. 按Item分组,用CASE WHEN分别统计两个位置的Qty总和
  3. 用HAVING子句过滤出存在Storage记录的物品(分组后判断Storage的总和大于0)

代码

SELECT
    Item,
    SUM(CASE WHEN Location = 'Storage' THEN Qty ELSE 0 END) AS Storage,
    SUM(CASE WHEN Location = 'Active' THEN Qty ELSE 0 END) AS Active
FROM
    ITEMS
WHERE
    Location IN ('Storage', 'Active')
GROUP BY
    Item
HAVING
    SUM(CASE WHEN Location = 'Storage' THEN Qty ELSE 0 END) > 0

错误原因解析

  • 原代码使用了不必要的自连接(ITEMS A, ITEMS B),导致逻辑混乱,无法正确统计
  • 直接在WHERE中过滤Location='Storage'会丢失Active位置的记录,因此无法统计该位置的数量,必须用HAVING在分组后筛选存在Storage记录的物品,而非提前过滤数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:25:11