我有一张客户姓名和传记信息表。但是,每个客户的表可以有多于一行,但所有客户仍然按相同的ID分组。例如,下面的客户12345总共有3行。有些行会有名字,有些则不会。同名,生日等等。例如,以下是我们在一个表中为客户12345提供的所有信息:
customerid | priority | firstname | lastname | birthdate | state |
12345 | 1 | null | Doe | 11051983 | null |
12345 | 2 | John | Does | null | TX |
12345 | 3 | null | null | null | Texas |
我需要将客户12345的行分成1行,并且必须有尽可能多的传记信息。如何让SQL通过并查找第一个非缺失值(名字,姓氏,生日等)并将其包含在客户12345的最后一行中?所以最终的结果应该是这样的:
customerid | firstname | lastname | birthdate | state |
12345 | John | Doe | 11051983 | TX |
由于客户信息超过多行,我不相信我可以使用Coalesce功能。还有其他想法吗?
这必须在SQL中完成。
提前致谢!
答案 0 :(得分:0)
你可以这样做:
SELECT MAX(firstname), MAX(lastname), MAX(birthday) FROM customer GROUP BY id
请注意 - 如果客户#1有2个不同的名字,这只会输出到最大名字。
答案 1 :(得分:0)
我认为合并可以使用 SUBQUERIES
完成INPUT
12345 NULL NULL NULL Texas
12345 NULL Does 11051983 NULL
12345 John Doe NULL TX
12346 NULL NULL NULL Texas
12346 NULL Last 1245678 NULL
12346 First Last2 NULL TX
输入(查询)
declare @tbl table(customerid int,firstname varchar(100),lastname varchar(100),birthdate varchar(100),state varchar(100))
insert into @tbl
select 12345,null,'Does','11051983',null union
select 12345,'John','Doe',null,'TX' union
select 12345,null,null,null,'Texas' union
select 12346,null,'Last','1245678',null union
select 12346,'First','Last2',null,'TX' union
select 12346,null,null,null,'Texas'
主要查询
SELECT DISTINCT
CustomerID,
(SELECT TOP 1 firstname FROM @tbl tbl2 WHERE tbl2.customerid=tbl.customerid AND firstname IS NOT NULL ORDER BY priority) FirstName
,(SELECT TOP 1 lastname FROM @tbl tbl2 WHERE tbl2.customerid=tbl.customerid AND lastname IS NOT NULL ORDER BY priority) LastName
,(SELECT TOP 1 birthdate FROM @tbl tbl2 WHERE tbl2.customerid=tbl.customerid AND birthdate IS NOT NULL ORDER BY priority) BirthDate
,(SELECT TOP 1 state FROM @tbl tbl2 WHERE tbl2.customerid=tbl.customerid AND state IS NOT NULL ORDER BY priority) State
FROM @tbl tbl
RESULT
12345 John Does 11051983 TX
12346 First Last2 1245678 TX
答案 2 :(得分:0)
For Sql server 2012+
,
SELECT TOP 1 FIRST_VALUE(firstname) OVER (
PARTITION BY customerid ORDER BY CASE
WHEN firstname IS NULL
THEN 0
ELSE 1
END DESC
,prioritys
) firstname
,FIRST_VALUE(lastname) OVER (
PARTITION BY customerid ORDER BY CASE
WHEN lastname IS NULL
THEN 0
ELSE 1
END DESC
,prioritys
) lastname
,FIRST_VALUE(birthdate) OVER (
PARTITION BY customerid ORDER BY CASE
WHEN birthdate IS NULL
THEN 0
ELSE 1
END DESC
,prioritys
) birthdate
,FIRST_VALUE(states) OVER (
PARTITION BY customerid ORDER BY CASE
WHEN states IS NULL
THEN 0
ELSE 1
END DESC
,prioritys
) states
FROM @t