我有下表
订单表:
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
答案 0 :(得分:0)
如果您希望同时拥有两个组的所有订单,则一种方法使用join
,group by
和having
:
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