2015-11-23 95 views
0

我需要T-SQL語句的幫助。Sql合併多行

我有下面的例子中的數據表:

id fistname lastname phone1 phone2 phone3 
------------------------------------------ 
01  Joe  Test 12345 
02  Joe  Test   45678 
03  Max Smith 12345 
04  Max Smith 45678 

現在,我想有這樣的結果:

Joe Test 12345 45678 
Max Smith 12345 
Max Smith 45678 

因此,只有行會合並具有相同的名稱和特定列中的電話號碼沒有差異。

在此先感謝

+0

你嘗試過什麼嗎?這裏有一個提示:https://msdn.microsoft.com/en-us/library/ms177673.aspx –

+0

在ID爲02的行中,phone1是NULL還是空字符串?你說「沒什麼區別」,但它明顯不同於「12345」。並且 - 對於完整的sql語句 - 此表的名稱是什麼?並且應該以某種方式處理「phone3」列嗎? –

+0

好吧,我想我應該提供一些背景信息。該表由用戶和供應商組成。 我想過濾出重複併合並它們,但可能有一個供應商和一個同名的客戶,但有不同的電話號碼。 (在我的例子中Max Joe)。他們應該在2個單獨的行。 – Poschi

回答

0

您可以通過GROUP BY列實現它(假設空的空間NULL)。

select firstname,lastname,phone1,phone2,phone3 from tablename 
group by firstname,lastname,phone1,phone2,phone3 
+0

這個quert和'select * from tablename'完全一樣嗎? –

+0

是的,這並沒有給出預期的結果。 –

+0

@JulienBlanchard如果select * from tablename,那麼我們不能將它按列id進行分組,因爲它的值不同,所以行不會分組。 –

0

假設你的表被命名的電話號碼Contacts和你

沒有差別在特定列

實際上意味着phone1在以下行是NULL和phone3與你的問題無關,試試這個:

SELECT DISTINCT A.fistname, A.lastname, A.phone1, B.phone2 
FROM Contacts as A 
LEFT JOIN Contacts as B ON (
    A.fistname = B.fistname AND 
    A.lastname = B.lastname AND 
    B.phone1 IS NULL) 
WHERE NOT A.phone1 IS NULL 

有什麼不明白的問題:你只是想選擇合併的行,或者你想用合併結果更新表嗎?

[編輯]:LEFT JOIN而不是INNER JOIN並添加了WHERE條款。

1

首先,你的數據存儲的方式是真的是不好。如果您計劃存儲有限數量的數據,那麼將它們全部存儲在一行中可以說是很好的。否則,當數據變化很大時,爲各種電話使用具有各種條目的表格是優選的。並且在任何情況下,您都應該標識具有ID的人員,而不是firstname + lastname + 3個電話的組合。

有了這樣的方式,你只需要屬性的ID到每一個人,並從那裏group by id

select MIN(id), firstname, lastname, MAX(phone1), MAX(phone2), max(phone3) 
from(
    select *, 
    (
    SELECT count(CASE WHEN t2.phone1!='' THEN 1 END) 
    FROM INSERT_TABLE_NAME t2 where t2.id<=t1.id 
) AS blkno 
    from INSERT_TABLE_NAME t1 
) X 
GROUP BY firstname, lastname, blkno; 
1

即使這可能不是答案,但你的查詢應該像下面,

SELECT fistname, lastname, MAX(phone1) phone1, MAX(phone2) phone2, MAX(phone3) phone3 
FROM TableName 
GROUP BY fistname, lastname 
ORDER BY fistname 

你可以看到下面的結果,

3

因此,如您所見,下面的圖片顯示了正確的查詢和結果。但請記住,如果有多部手機,則會丟失數據)。

enter image description here

我建議你改變表,按照下面的例子的想法。這裏我們有兩張桌子。一個用於保存聯繫人姓名,另一個用於保存聯繫人的電話號碼。

enter image description here

+0

出於興趣,您使用的是什麼客戶端? – fez

+0

您至少應該通過添加2個'Max Smith's併爲他們提供不同的手機,使您的「改革」示例與OP相同。通過這種方式,您可以執行標準的左連接,以顯示正確設計時使用數據的難度。 –

+1

也脫離主題 - 請問這是什麼SQL客戶端?或者什麼修改,它看起來真棒!謝謝,我是givin你的讚許;-) – krtek