0

これは私がSQLでやろうとしていることですが、PHPなどの別の言語でやるべきだとわかっているので、現時点では本当に難しい問題です。

基本的に私が持っているのは、注文番号とポリシーに関連する製品コードを含むデータベースです。

一部の注文では、キャンセルやアップグレードなどの複数のフェーズがあります (たとえば、アップグレードが行われた場合、元のポリシーがキャンセルされ、その後差額に対してアップグレードが行われます)。

私がやりたいのは、アップグレード注文に関連するすべてのキャンセル (製品コードで UP として指定) を除外し、詳細の変更 (製品コードで CD として指定) に関連するすべてのキャンセルを保持するクエリを実行することです。

要するに; クエリは、キャンセルを含むすべての注文を検索する必要がありますが、UP と同じ注文番号を持つキャンセルはすべて削除します。

これは基本的に、すべての UP 製品コードと関連する注文番号を検索し、その注文番号に関連付けられているすべてのキャンセルを削除する「foreach」を使用して実行できることを知っていますが、SQL でこれを達成する方法がわかりません。一時的に複数のテーブルを作成し、後で削除します。

テーブル構造は次のとおりです。

| Order Number | Product Code | Transaction Value |
|    1         |    RRCN      |    -30            |
|    1         |    RRUP      |     12            |
|    2         |    SMFP      |     30            |
|    3         |    SMCN      |    -12            |
|    3         |    SMCD      |     12            |
|    4         |    HUCN      |    -30            |

したがって、すべてのテーブルを表示するにはクエリが必要ですが、RRUP に関連する RRCN は削除してください。したがって、クエリは RRUP を探し、それが注文 1 であることを確認し、注文 1 に関連する RRCN を見つけて、結果からこれを削除します。結果は元のテーブルではないことに注意してください。

何か案は?とても有難い!(SQL Server 2008 を実行しています)

4

1 に答える 1

0

このクエリは仕事をするはずです:

SELECT * FROM Q19427600
WHERE RIGHT(ProductCode,2) <> 'CN'
OR (RIGHT(ProductCode,2) = 'CN' AND 
    OrderNumber NOT IN (SELECT OrderNumber FROM Q19427600 WHERE RIGHT(ProductCode,2) = 'UP'));

返される結果:

OrderNumber ProductCode TransactionValue
1           RRUP        12
2           SMFP        30
3           SMCN        -12
3           SMCD        12
4           HUCN        -30
于 2013-10-17T15:05:19.693 に答える