通过分组并检查非null将多行合并为一行

时间:2018-09-12 16:33:45

标签: sql sql-server tsql select group-by

我有这种格式的数据。我想将多行合并为按ID列进行的单行分组。按ID分组时,每一行每一列将只有一个非空值和一个非空值。

   [ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
    1,    data1,  null,    null,  null,    null,  null
    1,    null,   data2,    null,  null,    null,  null
    1,    null,  null,    data3,  null,    null,  null
    1,    null,  null,    null,  data4,    null,  null
    1,    null,  null,    null,  null,    data5,  null
    1,    null,  null,    null,  null,    null,  data6
    2,    data1,  null,    null,  null,    null,  null
    2,    null,  data2,    null,  null,    null,  null
    2,    null,  null,    data3,  null,    null,  null
    2,    null,  null,    null,  data4,    null,  null
    2,    null,  null,    null,  null,    data5,  null
    2,    null,  null,    null,  null,    null,  data6

Desired Output:
   [ID], [foo], [foo1], [foo2], [foo3], [foo4], [foo5]
   1,    data1,  data2,  data3, data4,   data5,  data6
   2,    data1,  data2,  data3, data4,  data5,  data6

2 个答案:

答案 0 :(得分:3)

您可以使用max()

select id, max(foo) as foo, max(foo1) as foo1, . . . 
from t
group by id;

我应该注意,您的原始数据结构通常是由有点歪斜的查询产生的。有时,更容易修复生成结果的代码。

答案 1 :(得分:2)

聚合函数maxmin(以及大多数其他函数)将仅忽略null。您可以按ID分组并查询其他列的最大值,这将返回该列具有的单个非null值:

SELECT   id, MAX(foo), MAX(foo1), MAX(foo2), MAX(foo3), MAX(foo4), MAX(foo5)
FROM     mytable
GROUP BY id