2016-02-22 35 views
0

我嘗試了一些針對此問題發佈在Stack上的各種解決方案,但沒有一個保留空值(並且它看起來像整個查詢是建立在假設)。根據ID將多行變爲單行,並保留空值

我有一個100萬行的表。有10列。第一列是id。每個ID對於「item」(在我的情況下是一個銷售訂單)是唯一的,但有多個行。每一行都是完全無效的,或者在其中一列中有一個值。沒有兩行具有相同ID的行具有相同列的數據。我需要根據ID將這些多行合併到一行中。不過,我需要保留空值。如果第一列在所有行中都爲空,我需要將它保留在最終數據中。

有人可以幫助我用這個查詢我一直堅持它2小時了。

id - Age - firstname - lastname 
1 13  null  null 
1 null  chris null 

應該輸出

1 13 chris null 
+0

'我需要保留空值',這是什麼意思?,你想連接一個實際的'null'字符串嗎? – Lamak

+1

請顯示您的表格結構,樣本數據和預期輸出,以便人們不必猜測您想要的內容,並在確定帖子發現他們猜測錯誤後浪費時間修復帖子:http://stackoverflow.com/help/how要問 –

+0

,這聽起來像數據中的很多假設,沒有任何限制它的方法......你是說每個ID可能有10行,每行有9個其他列之一的單個值從不重複列同一個ID的值? – Kritner

回答

2
select id, max(col1), max(col2).. etc 
from mytable 
group by id 
+0

@ChristopherMaggiulli你不斷地重複說明,而不會解釋你實際上的意思 – Lamak

+0

@ChristopherMaggiulli正如我所說的,只需發佈​​表格數據,並且有人可以編輯你的問題,以便正確格式化 – Lamak

3

這聽起來像你想的聚集查詢:

select id, max(col1) as col1, max(col2) as col2, . . . 
from t 
group by id; 

如果所有值都NULL,那麼這將產生NULL。如果其中一行(對於id)有一個值,那麼這將產生該值。

+1

@ChristopherMaggiulli。 。 。如果給定id的列中的所有值都是NULL,則結果爲NULL。這似乎是你所要求的:「如果第一列在所有行中都爲空,我需要在最終數據中保留它。」 –

1

正如其他人已經提到,你應該使用聚合查詢來實現這一點。

select t1.id, max(t1.col1), max(t1.col2) 
from tableone t1 
group by t1.id 

這應該會返回空值。如果您在處理空值時遇到問題,可以使用ISNULL()來實現一些邏輯。確保你的數據字段確實是空值而不是空字符串。

如果沒有返回空值,請檢查以確保具有特定ID的每個單行只有空值。如果其中一個返回一個空字符串,那麼是的,它將刪除null並返回其他任何內容。