1

私はこれを使ってグーグルで数時間ローミングしています。

2つのテーブルがあります:

AccountTable 
ID | AccountID | OrderID

OrderTable
ID | OrderID | OrderStatus

OrderStatusの値は1、2、3、4で、4は完了ステータスです。

注文テーブルでは、注文ステータスが更新されるときに複数の行が追加されます。したがって、完了した注文の場合、OrderTableにはそれぞれ1、2、3、および4のステータスを持つ4つの行があります。

1つのアカウントで複数の注文を行うことができます。

すべての注文が完了したアカウントを見つけたいです。

私はこれまで見つけました:

select * from AccountTable
INNER JOIN OrderTable
ON AccountTable.OrderID = OrderTable.OrderID
AND OrderTable.OrderStatus = 4

これにより、完了ステータスの注文が少なくとも1つあるアカウントが選択されます。

ただし、これは、1つの注文が完了し、同じアカウントの他の注文が完了していない場合のシナリオには適用されません。その時はアカウントを選びたくありません。

編集:これを明確にするためにいくつかのデータを表示したかっただけです:

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

Name1ではなくName2のみを取得したい。

4

3 に答える 3

1

ビジネスロジックが破損しないと仮定すると、完了した注文の数(status == 4)が開始された注文の数(status == 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

余談ですが、あなたのテーブルは誤解を招くような名前が付けられているようです。 AccountTableAccount2Ordersテーブルであり、OrderTableむしろOrderStagesOrLifeCycleテーブルです。

于 2012-10-29T14:08:13.990 に答える
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;
于 2012-10-29T13:59:53.140 に答える
0

参加しない、副選択。また、完了した注文を探す必要はありません。ステータス4のエントリがない注文がないアカウントを探します。つまり、ステータスがない注文が存在するアカウント4。

SQL Exists句を確認し、これをgroupbyします。ステータス4のない注文を表示するクエリを最初に取得してから、それを注文テーブルに結合できます。

于 2012-10-29T13:55:06.323 に答える