我有一个订单表,每个订单中的每个商品都有一行。订单号在每一行(当然不是唯一的)。商品编号是唯一的。我需要找到只有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美元
除了如何找到糖果外,我没有开始查询,但我得到了所有这些。
答案 0 :(得分:0)
我添加了样本数据,因此我们有2个订单,100%糖果......还有更多没有。
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%糖果。如果它们不匹配,那么我们知道该订单至少有一个非糖果项目,并且可以排除整个订单。
由于我不确定您是否希望单独汇总每个订单的成本,或者所有订单总和,我提供了两种方法。