5

SQLサーバーに次のような一連のデータがあります。

ID ID_Invoice Article Quantity Status
1  10         carrot  10       null
2  10         carrot  5        C
3  10         onion   8        null
4  10         onion   4        C
5  11         tomato  20       null
6  11         tomato  18       C
7  11         onion   2        null
8  11         onion   1        C

これは、顧客が (1 つの請求書で) 10 個のニンジンと 8 個のタマネギを注文したが、実際には 5 個のニンジンと 4 個のタマネギしか受け取っていないことを意味します。ステータスがNULLの場合は元の数量、ステータスがCの場合は訂正済数量です

次のようなテーブルを生成する必要があります

ID ID_Invoice Article Quantity 
1  10         carrot  -5       
2  10         onion   -4
3  11         tomato  -2
4  11         onion   -1

各請求書の注文数量と実際の数量の差を示します。どうやって始めたらいいのかわからない。どんな助けでも深く感謝します:)

4

4 に答える 4

8

過度のJOINを含まない単純なCASE式のオプション

SELECT ID_Invoice, Article, 
       SUM(CASE WHEN Status IS NULL 
  THEN -1 * Quantity ELSE Quantity END) AS Quantity
FROM dbo.test38
GROUP BY ID_Invoice, Article

結果:

ID_Invoice Article Quantity 
10  carrot  -5
10  onion   -4
11  onion   -1
11  tomato  -2

SQLFiddle のデモ

于 2013-03-15T11:05:54.307 に答える
2

リソース集約度が最も低い:

SELECT id_invoice
, article
, org_quantity
, new_quantity
, new_quantity - org_quantity diff
FROM (SELECT id_invoice
      , article
      , max(CASE WHEN status IS NULL THEN quantity else null END) org_quantity
      , max(CASE WHEN status = 'C' THEN quantity else null END) new_quantity
      FROM   orders
      GROUP BY id_invoice
      , article)

ここで動作することを確認してください:http ://sqlfiddle.com/#!4 / f96adf / 14

于 2013-03-15T11:02:40.240 に答える
2

使用しているRDBMSを指定していませんが、私の答えはANSI-SQL標準に準拠しています:)そこにあるすべての有効なRDBMSで動作します。

SELECT
yt1.ID_Invoice, 
yt1.Article,
yt2.Quantity - yt1.Quantity AS Quantity
FROM
yourTable yt1
INNER JOIN yourTable yt2 ON yt1.ID_Invoice = yt2.ID_Invoice 
                            AND yt1.Article = yt2.Article 
                            AND yt2.Status = 'C'
WHERE
yt1.Status IS NULL

この回答は仮定です。ステータスが NULL のレコードと、ステータスが「C」の対応する行が常に存在します。そうでない場合は、次のように調整する必要があります。

SELECT
yt1.ID_Invoice, 
yt1.Article,
CASE WHEN yt2.Quantity IS NULL THEN yt1.Quantity ELSE yt2.Quantity - yt1.Quantity END AS Quantity
FROM
yourTable yt1
LEFT JOIN yourTable yt2 ON yt1.ID_Invoice = yt2.ID_Invoice 
                            AND yt1.Article = yt2.Article 
                            AND yt2.Status = 'C'
WHERE
yt1.Status IS NULL
于 2013-03-15T10:57:39.793 に答える
1

したがって、最初に2つのクエリを実行して実際の注文を注文から分離する必要があります。次に、注文を実際の注文に結合したままにする必要があります。

select 
   Recived.ID, 
   Recived.ID_Invoice,
   Recived.Article,
   Recived.Quantity - Ordered.Quantity as Quantity
from
   (select * from dataTable where Status is null) as Ordered
   left join (select * from  dataTable where Status = 'C')  as Recived on (Ordered.ID_Invoice = Recived.ID_Invoice and Ordered.Article = Recived.Article )

ノート!varcharsを比較する代わりに、「左結合」で使用する各記事のIDがあるとよいでしょう。

これがフィドルの例です: http ://sqlfiddle.com/#!2/16666/1

于 2013-03-15T10:56:14.637 に答える