选择具有相同ID的行,折叠具有空值/非空值的行

时间:2019-09-03 16:30:26

标签: sql sql-server tsql

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

数据:

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相同的地方获取不为null的所有内容。如果它们都为空,则获取空值。我尝试通过合并进行自我连接,但是没有用。我感觉好像已经接近了,但是那里有一个我可以使用的函数可以使它变得更容易吗?

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

1 个答案:

答案 0 :(得分:2)

除非您有指定顺序的列,否则表中没有“第一”行。您的表没有这样的列。

因此,您可以做的最好的就是聚合:

gmail.com