检索与物品组一起出售的所有订单

时间:2019-11-16 15:19:52

标签: sql sql-server sql-server-2012

我有下表

订单表

SiteID   BusinessDate   ItemName   Units Sold   Units Sale   ItemNo  OrderNo
----------------------------------------------------------------------------
1        16/08/2018     Apple         1             5        10001    122-1
1        16/08/2018     Beans         9             18       10004    122-1

1        16/08/2018     Apple         2             5        10001    122-4
1        16/08/2018     Coffee        2             6        10002    122-4
1        16/08/2018     Beans         4             8        10004    122-4

2        16/08/2018     Apple         2             5        10001    122-2
2        16/08/2018     Coffee        1             6        10002    122-2

3        16/08/2018     Bread         3             5        10003    122-3
3        16/08/2018     Beans         7             17       10004    122-3

菜单主表

ItemNo    Full Name   Menu Category 
---------------------------------
10001       Apple     Group1    
10002       Coffee    Group1  
10003       Bread     Group2   
10004       Beans     Group2   
10005       Orange    Group3 

基于上表,我想获取在第1组商品和第2组一起出售的所有订单明细吗?

结果

SiteID   BusinessDate   ItemName   Units Sold   Units Sale   ItemNo  OrderNo
----------------------------------------------------------------------------
1        16/08/2018     Apple         1             5        10001    122-1
1        16/08/2018     Beans         9             18       10004    122-1

1        16/08/2018     Apple         2             5        10001    122-4
1        16/08/2018     Coffee        2             6        10002    122-4
1        16/08/2018     Beans         4             8        10004    122-4

3 个答案:

答案 0 :(得分:0)

如果您希望同时拥有两个组的所有订单,则一种方法使用joingroup byhaving

select o.orderno
from orders o join
     itemmaster im
     on o.itemno = im.itemno
group by o.orderno
having sum(case when im.category = 'Group1' then 1 else 0 end) > 0 and
       sum(case when im.category = 'Group2' then 1 else 0 end) > 0;

如果您需要订单的明细行,请使用相关的子查询:

select o.*
from orders o
where exists (select 1
              from itemmaster im
              where o.itemno = im.itemno and im.category = 'Group1'
             ) and
      exists (select 1
              from itemmaster im
              where o.itemno = im.itemno and im.category = 'Group2'
             );

答案 1 :(得分:0)

加入表,按顺序编号分组,并在having子句中设置条件:

select o.orderno
from [Order] o inner join [Menu Master] m
on m.itemno = o.itemno
where m.[Menu category] in ('Group1', 'Group2')
group by o.orderno
having count(distinct m.[Menu category]) = 2

如果要获取[Order]中的所有详细信息:

select * from [Order]
where orderno in (
    select o.orderno
    from [Order] o inner join [Menu Master] m
    on m.itemno = o.itemno
    where m.[Menu category] in ('Group1', 'Group2')
    group by o.orderno
    having count(distinct m.[Menu category]) = 2
)

答案 2 :(得分:0)

  

我想获取与组2一起出售的组1物品下的所有订单明细

我可能会误会,但是听起来您需要在JOIN的订单表和菜单主表之间有一个简单的ItemNo,并在[Menu Master Table].[Menu Category]上有一个过滤器。由于您不是要按照下面的orderno进行分组,因此我假设您正在查找(注意:您的订单表示例中实际上没有任何包含Group3的订单,因此此结果正好是订单表在您的问题中是什么样的:

SiteID   BusinessDate   ItemName   Units Sold   Units Sale   ItemNo  OrderNo
----------------------------------------------------------------------------
1        16/08/2018     Apple         1             5        10001    122-1
1        16/08/2018     Beans         9             18       10004    122-1
1        16/08/2018     Apple         2             5        10001    122-4
1        16/08/2018     Coffee        2             6        10002    122-4
1        16/08/2018     Beans         4             8        10004    122-4
2        16/08/2018     Apple         2             5        10001    122-2
2        16/08/2018     Coffee        1             6        10002    122-2
3        16/08/2018     Bread         3             5        10003    122-3
3        16/08/2018     Beans         7             17       10004    122-3
SELECT SiteID, BusinessDate, ItemName, [Units Sold], [Units Sale], o.ItemNo, OrderNo
FROM Orders o
JOIN MenuMaster m ON o.ItemNo = m.ItemNo
WHERE m.[Menu Category] IN ('Group1', 'Group2')

这基本上是@forpas编写的内容,但是他根据您的问题添加了对我来说毫无意义的小组,但也许您需要这一部分。

更新 预期结果会有所帮助。

我通常将#temp表用于此类内容,而不是内联子查询。对我来说,概念化起来更容易。可能有一种更“优雅”的方法来执行此操作,但以下方法会起作用。

查找其中包含第1组的订单号,并将其放入临时表中。然后在这些订单中,找到具有组2的订单号并将其放入最终临时表中。然后将Order表连接到第二个临时表:

SELECT o.OrderNo
INTO #GroupOneOrders
FROM Orders o
JOIN MenuMaster m on o.ItemNo = m.ItemNo
WHERE m.MenuCategory = 'Group1'
GROUP BY o.OrderNo

SELECT o.OrderNo
INTO OrdersWithGroupOneAndTwo
FROM Orders o
JOIN #GroupOneOrders g1 on o.OrderNo = g1.OrderNo
WHERE EXISTS 
(
    SELECT 1
    FROM Orders o2
    JOIN MenuMaster m on o.ItemNo = m.ItemNo
    WHERE o2.OrderNo = o.OrderNo
        AND m.MenuCategory = 'Group2'
)

SELECT o.SiteID, o.BusinessDate, o.ItemName, o.UnitsSold, o.UnitsSale, o.ItemNo, o.OrderNo
FROM Orders o
JOIN #OrdersWithGroupOneAndTwo g ON o.OrderNo = g.OrderNo