首页 > 解决方案 > 选择具有相同 ID 的行,折叠具有空/非空值的行

问题描述

我觉得一看到这个我就会打自己,但这里是:

数据:

CREATE TABLE testdata (
    id int,
    email varchar(25),
    street nvarchar(50),
    town nvarchar(15),
    zip nvarchar(5)
    source nvarchar(15))


INSERT INTO testdata (
    id,
    email,
    street,
    town,
    zip,
    source
)
VALUES
    (
        1,
        'myemail@email.com',
        null,
        'happy',
        null
    ),
    (
        1,
        'myemail@gmail.com',
        null,
        'happy',
        '19400'
    );

这产生:

-------------------------------------------------------------
|id |email              |street        |town        |zip    |
|1  |myemail@email.com  |happy place   |happy       |(null) |
|1  |myemail@gmail.com  |(null)        |happy       |19400  |

我想要达到的是

|id |email              |street        |town        |zip    |
|1  |myemail@email.com  |happy place   |happy       |19400  |

基本上我想折叠所有行并在 ID 相同的情况下抓取任何不为空的内容。如果它们都为空,则获取空值。我尝试通过合并进行自加入,但是没有用。我觉得好像我很接近但是有一个我可以使用的功能可以让这更容易吗?

注意事项:只能有两行具有相同的 ID(不确定这是否使其更难或更容易)。如果两行都填充了信息,我想要第一行。

标签: sqlsql-servertsql

解决方案


表中没有“第一”行之类的东西,除非您有一个指定排序的列。您的表没有这样的列。

所以,你能做的最好的就是聚合:

select email, max(street) as street, max(town) as town, max(zip) as zip
from testdata
group by email;

推荐阅读