SQL-查找仅包含某些项目的订单
Posted
技术标签:
【中文标题】SQL-查找仅包含某些项目的订单【英文标题】:SQL- Finding Orders with only certain items 【发布时间】:2017-04-28 15:07:15 【问题描述】:我有一个订单表,每个订单中的每个项目都有一行。订单号在每一行中(当然不是唯一的)。商品编号是唯一的。我需要找到只有 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 美元
除了如何找到糖果项目外,我没有开始查询,但我得到了所有这些。
【问题讨论】:
添加一些示例表数据和预期的结果 - 以及格式化文本。标记您正在使用的 dbms。并向我们展示您当前的查询尝试。SELECT ORDER_NUMBER FROM [ORDER] GROUP BY ORDER_NUMBER HAVING COUNT(1) = count(case when Item_Type = 'Candy' then 1 end)
基本上检查订单上的商品数量是否与 candy
类型的订单上的商品数量相匹配。这会为您提供您想要数据的订单列表。
【参考方案1】:
我添加了示例数据,因此我们有 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% 糖果。如果它们不匹配,那么我们知道该订单至少有 1 件非糖果商品,并且可以排除整个订单。
由于我不确定您是希望单独汇总每个订单的成本还是汇总所有订单的成本,所以我提供了这两种方法。
【讨论】:
让我们看看订单 987。count(1)
将是 3,因为订单上有 3 件商品。 Count(Case when catgry='CANDY' then 1 end)
将是 2,因为有 2 个糖果和 1 个鞋子。 3 2 所以整个订单都被消除了。顶部的 SQL Fiddle 链接显示了此工作。有道理?如果不继续问!
将Having
视为另一个 where 子句,您可以使用它来限制数据,但在聚合完成之后。你不能在 where 子句中聚合(除非你使用子查询),但你可以在有!
你是该死的炸弹!非常感谢,太完美了!
而您的“想拥有”评论让我明白了这一点,再次感谢!以上是关于SQL-查找仅包含某些项目的订单的主要内容,如果未能解决你的问题,请参考以下文章
《精品毕设》java ssm springboot二手物品商城项目(完整源码+sql+论文)主要功能:登录注册商品浏览分类模糊查找轮播图热销商品购物车订单订单流程控制用户管理
java ssm springboot网上蛋糕商城项目12(《精品毕设》完整源码+sql+论文)主要功能:登录注册商品浏览分类模糊查找轮播图热销商品购物车订单订单流程控制用户管理