2012-11-23 42 views
2

我有一個問題,我的SQL查詢不會擺脫空值。SQL組合列

我已經嘗試了無數種不同的技術,但我是一個新手。

我想要的結果是一個訂單號,後面跟着狀態出現在一行中的日期。

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函數嗎?爲什麼空值仍然存在?

任何幫助將不勝感激。

感謝,

安德魯

+0

順便說一句,所有的'和osr.create_date沒有在你的情況下null'位是多餘的,可遺漏了。如果其條件不滿足,則這些CASE中的任何一個評估爲NULL。所以目前,當'osr.create_date'爲NULL但條件的第一部分爲true時,CASE將返回NULL,因爲整個條件爲false。但是,修改的CASE(具有縮短的條件)也會返回NULL,只有它會將其作爲'osr.create_date'的內容返回。 –

回答

3

如果您添加聚合函數到每個CASE語句,然後GROUP BY記錄將合併成一個單一的一行:

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 
2

使用GROUP BY到將訂單ID分組成一行,並在案例陳述上輸入MAX以獲得正確的行:

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 
+0

感謝您的幫助。我還有其他領域的補充,所以我把它們放在小組中,我很樂意去。 – Diggs11

+0

由於不能在GROUP BY子句中使用列別名,因此不會像寫入那樣工作,您需要參考我所做的實際列名稱'mo.order_id' – Taryn

+0

。我將mo.order_id與其他適用的列一起使用。我知道列別名不是SQL中可用的對象。 – Diggs11

2

假設(msorder_id, order_status_cd)在表order_status_recordUNIQUE,這裏是沒有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 ; 
+0

我實際上使用選擇不同。這樣做是否有優勢? – Diggs11

+0

爲什麼你需要'DISTINCT'? –

+0

由於大量的額外數據,會有重複的記錄。 – Diggs11