我已经在谷歌漫游了几个小时了。
有两张桌子:
AccountTable
ID | AccountID | OrderID
OrderTable
ID | OrderID | OrderStatus
OrderStatus的值为1,2,3,4,其中4为完成状态。
在订单表中,在更新订单状态时添加多行。 因此,对于已完成的订单,您将在OrderTable中分别拥有4行,分别为1,2,3和4状态。
单个帐户可以有多个订单。
我想找到所有订单已完成的帐户。
我发现了这么多:
select * from AccountTable
INNER JOIN OrderTable
ON AccountTable.OrderID = OrderTable.OrderID
AND OrderTable.OrderStatus = 4
这将选择至少有一个订单处于已完成状态的帐户。
但这不会涵盖一个订单完成而另一个订单不同的情况。我当时不想选择帐户。
编辑: 我只想展示一些数据以使其更清晰:
AccountTable
1 | Name1 | Order1
2 | Name1 | Order2
3 | Name2 | Order3
4 | Name2 | Order4
OrderTable
1 | Order1 | 1
2 | Order1 | 2
3 | Order1 | 3
4 | Order2 | 1
5 | Order2 | 2
6 | Order2 | 3
7 | Order2 | 4
8 | Order3 | 1
9 | Order3 | 2
10 | Order3 | 3
11 | Order3 | 4
12 | Order4 | 1
13 | Order4 | 2
14 | Order4 | 3
15 | Order4 | 4
我只想检索Name2而不是Name1。
答案 0 :(得分:1)
假设您的业务逻辑不会被破坏,我认为您希望完成订单数量(状态== 4)的帐户与已启动的订单数量相同(状态== 1):
SELECT AccountID
FROM (SELECT AccountTable.AccountID AS AccountID,
SUM(CASE OrderTable.OrderStatus WHEN 1 THEN 1 ELSE 0 END) AS o1,
SUM(CASE OrderTable.OrderStatus WHEN 4 THEN 1 ELSE 0 END) AS o4
FROM AccountTable
INNER JOIN
OrderTable
ON AccountTable.OrderID = OrderTable.OrderID
GROUP BY 1) d
WHERE o1 = o4;
您可以从那里加入以获取AccountTable
的所有字段。
顺便说一句,在我看来,你的表格被误导性地命名。 AccountTable
是 Account2Orders 表,而OrderTable
则是 OrderStagesOrLifeCycle 表。
答案 1 :(得分:0)
没有加入,subselect。您也不会寻找一个完美的订单 - 您查找的订单没有没有状态4条目的订单。即订单EXISTS没有状态4的帐户。
检查SQL Exists子句和group by。你将首先获得一个显示没有状态4的订单的查询,然后你可以将它加入订单表。
答案 2 :(得分:0)
已编辑 - 现在更好地了解您的数据:
Select
c.AccountID
From (
Select
a.AccountID,
o.OrderID,
Max(o.OrderStatus) As OrderState
From
AccountTable a
Inner Join
OrderTable o
On a.OrderID = o.OrderID
Group By
a.AccountID,
o.OrderID
) c
Group By
c.AccountID
Having
Min(c.OrderState) = 4;