SQL- 查找仅包含某些商品的订单

SQL- Finding Orders with only certain items

我有一个订单 table,每个订单中的每个项目都有一行。订单号在每一行中(当然不是唯一的)。项目编号是唯一的。我需要找到只有 100% 的某种类型商品的订单 - 比方说 "candy"。因此,如果一个订单中有 10 件商品,其中 10 件都是糖果,我想从这些行中获取有关该订单的一些信息。如果一个 10 件商品的订单有 9 件糖果和 1 件鞋子,我不需要该订单的任何信息。除了非常基础的计算外,我的 SQL 技能非常平庸。那我该怎么做呢?谢谢!

示例 orders table:

ORD_NUM    ITEM    CATGRY    COST
123        567        CANDY      
123        489        CANDY      
123        990        CANDY      
987        222        SHOES      
987        990        CANDY      
987        567        CANDY      

预期结果:
订单数:2 含 100% 糖果的订单:1 含 100% 糖果的订单成本:18 美元

除了如何找到糖果外,我没有其他问题,但我得到了所有糖果。

我添加了样本数据,所以我们有 2 个订单有 100% 糖果……还有更多没有。

WORKING SQL FIDDLE

SELECT ORD_NUM, sum(cost) as Sum_Cost
FROM ORDERS
GROUP BY ORD_NUM
HAVING COUNT(1) = count(Case when Catgry = 'CANDY' then 1 end);

如果您需要汇总所有内容,您可以将此查询包装在一个外部查询中,该查询只计算 order_nums...

SELECT COUNT(ORD_NUM), sum(Sum_cost) as Sum_cost
FROM (SELECT ORD_NUM, sum(cost) as Sum_Cost
      FROM ORDERS
      GROUP BY ORD_NUM
      HAVING COUNT(1) = count(Case when Catgry = 'CANDY' then 1 end)
     ) OrderCost;

这是如何工作的:

我们使用简单的聚合来计算订单上所有商品的数量以及订单上所有糖果商品的数量。我们比较这两个值,如果它们匹配,我们就知道订单是 100% 糖果。如果它们不匹配,那么我们知道该订单至少有 1 件非糖果商品,可以排除整个订单。

由于我不确定您是希望对每个订单的费用单独求和,还是对所有订单求和,所以我提供了这两种方法。