2

SQL クエリが null 値を取り除かないという問題があります。

私は無数の異なるテクニックを試しましたが、私は初心者です。

私の望ましい結果は、注文番号の後にステータスが発生した日付がすべて1行で表示されることです。

select mo.order_id OrderID,
case when osr.order_status_cd = 120 and osr.create_date is not null then    osr.create_date end as POCreated,
case when osr.order_status_cd = 220 and osr.create_date is not null then osr.create_date end as Ordered,
case when osr.order_status_cd = 300 and osr.create_date is not null then osr.create_date end as Shipped,
case when osr.order_status_cd = 400 and osr.create_date is not null then osr.create_date end as Received,
case when osr.order_status_cd = 500 and osr.create_date is not null then    osr.create_date end as Completed,
from order_status_record osr
inner join msorder mo on mo.order_id = osr.msorder_id

次のような結果が得られる代わりに:

OrderID POCreated   Ordered     Shipped      Received    Completed
497822  11/18/2012  NULL          NULL        NULL        NULL
497822  NULL       11/19/2012     NULL        NULL        NULL
497822  NULL        NULL       11/19/2012     NULL        NULL
497822  NULL        NULL          NULL     11/19/2012     NULL
497822  NULL        NULL          NULL        NULL     11/19/2012

これ欲しい:

OrderID POCreated   Ordered     Shipped      Received    Completed
497822  11/18/2012  11/19/2012  11/19/2012   11/19/2012  11/19/2012

仮想テーブルを作成する必要がありますか? if 関数は必要ですか? Null がまだ存在するのはなぜですか?

どんな助けでも大歓迎です。

ありがとう、

アンドリュー

4

3 に答える 3

3

CASE各ステートメントに集計関数を追加するとGROUP BY、レコードが 1 つの行に統合されます。

select mo.order_id OrderID,
  max(case when osr.order_status_cd = 120 and osr.create_date is not null then osr.create_date end) as POCreated,
  max(case when osr.order_status_cd = 220 and osr.create_date is not null then osr.create_date end) as Ordered,
  max(case when osr.order_status_cd = 300 and osr.create_date is not null then osr.create_date end) as Shipped,
  max(case when osr.order_status_cd = 400 and osr.create_date is not null then osr.create_date end) as Received,
  max(case when osr.order_status_cd = 500 and osr.create_date is not null then osr.create_date end) as Completed,
from order_status_record osr
inner join msorder mo 
  on mo.order_id = osr.msorder_id
group by mo.order_id
于 2012-11-23T17:41:17.957 に答える
2

(msorder_id, order_status_cd)それがUNIQUEtableにあると仮定すると、を使用しorder_status_recordない場合の解決策は次のGROUP BYとおりです。

SELECT 
    mo.order_id         AS OrderID,
    osr120.create_date  AS POCreated,
    osr220.create_date  AS Ordered,
    osr300.create_date  AS Shipped,
    osr400.create_date  AS Received,
    osr500.create_date  AS Completed
FROM 
    msorder AS mo 
  LEFT JOIN 
    order_status_record AS osr120 
      ON  osr120.msorder_id = mo.order_id 
      AND osr120.order_status_cd = 120 
  LEFT JOIN 
    order_status_record AS osr220 
      ON  osr220.msorder_id = mo.order_id 
      AND osr220.order_status_cd = 220 
  LEFT JOIN 
    order_status_record AS osr300 
      ON  osr300.msorder_id = mo.order_id 
      AND osr300.order_status_cd = 300 
  LEFT JOIN 
    order_status_record AS osr400 
      ON  osr400.msorder_id = mo.order_id 
      AND osr400.order_status_cd = 400 
  LEFT JOIN 
    order_status_record AS osr500 
      ON  osr500.msorder_id = mo.order_id 
      AND osr500.order_status_cd = 500 ;
于 2012-11-23T18:35:48.187 に答える
2

GROUP BY注文 ID を行にグループ化MAXし、case ステートメントで正しい行を取得するために使用します。

select mo.order_id OrderID,
    MAX(case when osr.order_status_cd = 120 and osr.create_date is not null then    osr.create_date end) as POCreated,
    MAX(case when osr.order_status_cd = 220 and osr.create_date is not null then osr.create_date end) as Ordered,
    MAX(case when osr.order_status_cd = 300 and osr.create_date is not null then osr.create_date end) as Shipped,
    MAX(case when osr.order_status_cd = 400 and osr.create_date is not null then osr.create_date end) as Received,
    MAX(case when osr.order_status_cd = 500 and osr.create_date is not null then    osr.create_date end) as Completed,
from order_status_record osr
inner join msorder mo on mo.order_id = osr.msorder_id
GROUP BY order_id
于 2012-11-23T17:41:57.063 に答える