SQL-仅查找具有特定项目的订单

时间:2017-04-28 15:07:16

标签: sql percentage

我有一个订单表,每个订单中的每个商品都有一行。订单号在每一行(当然不是唯一的)。商品编号是唯一的。我需要找到只有100%特定类型物品的订单 - 让我们说"糖果"。因此,如果一个订单中有10个项目,并且其中所有10个都是糖果,我想要从这些行中获得有关该订单的一些信息。如果10件商品订单有9件糖果和1件鞋子,我不想要任何订单中的任何信息。当谈到非常基本的计算时,我的SQL技能非常平庸。那我该怎么做呢?谢谢!

示例orders表:

ORD_NUM    ITEM    CATGRY    COST
123        567        CANDY     $4 
123        489        CANDY     $5 
123        990        CANDY     $9 
987        222        SHOES     $10 
987        990        CANDY     $9 
987        567        CANDY     $4 

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

除了如何找到糖果外,我没有开始查询,但我得到了所有这些。

1 个答案:

答案 0 :(得分:0)

我添加了样本数据,因此我们有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);

如果你需要聚合ALL,你可以将这个查询包装在一个外部查询中,该查询只计算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%糖果。如果它们不匹配,那么我们知道该订单至少有一个非糖果项目,并且可以排除整个订单。

由于我不确定您是否希望单独汇总每个订单的成本,或者所有订单总和,我提供了两种方法。