2015-11-23 98 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