2013-07-05 127 views
0

我正在尋找將前三條記錄的值「變平」爲第四條記錄(如圖所示)的最佳方法。這些值將是文本,每個記錄在其中一個值列中只會有一個值。另外,一個帳號可能會有一個或多個記錄,例如該示例。謝謝。將記錄合併爲一個

注:我看到了有關我的問題一些其他話題,但他們並不像我不太一樣:

Sql Merging multiple records into one record

Merge multiple records into one row in a table

AcctNum|Val1|Val2|Val3| 
1  |x | | | 
1  | |y | | 
1  | | |z | 
1  |x |y |z | 
+0

我必須說我無法看到你從這[Sql合併多個記錄到一個記錄]要求的差異(http://stackoverflow.com/questions/16668685/sql-merging-multiple-records-一記錄)。答案似乎也不錯。 –

+0

這些空白值是否爲空或者它們是否爲空字符串?是否有可能單個AcctNum在Val1字段中具有多個具有值的記錄? – MatBailie

+0

@LennartRegebro - 錯,不,這不是重複的... – MatBailie

回答

1
SELECT 
    AcctNum, 
    MAX(Val1) AS Val1, 
    MAX(Val2) AS Val2, 
    MAX(Val3) AS Val3 
FROM 
    yourTable 
GROUP BY 
    AcctNum 

NULL絕不是最大值或任何一組值的最小值。如果沒有行,則MAX()MIN()將僅返回NULL,或者全部的值爲NULL

這意味着MAX()MIN()將消除所有NULL並返回一個可用值。

0

執行此操作的SQL方法是使用聚合函數和GROUP BY,例如,

SELECT t.AcctNum 
    , MAX(t.Val1) AS Val1 
    , MAX(t.Val2) AS Val2 
    , MAX(t.Val3) AS Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
GROUP BY t.AcctNum 

如果你想返回三個行,再加上第四行中,你可以使用UNION ALL操作:如果要返回多個ACCTNUM

SELECT t.AcctNum 
    , t.Val1 
    , t.Val2 
    , t.Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
UNION ALL 
SELECT t.AcctNum 
    , MAX(t.Val1) AS Val1 
    , MAX(t.Val2) AS Val2 
    , MAX(t.Val3) AS Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
GROUP BY t.AcctNum 

,和你想的行以特定順序返回,這可能會很棘手。

0

最簡單的方法是聚集:

select AcctNum, max(val1) as val1, max(val2) as val2, max(val3) as val3 
from Yourtable t 
group by AcctNum; 

我認爲在第二行分號是一個錯字,你真的不打算如果存在將其刪除。