根据ID将多行转换为单行,并保留空值

时间:2016-02-22 16:15:30

标签: sql sql-server tsql

我已经尝试了一些针对此问题在Stack上发布的各种解决方案,但它们都没有保留空值(似乎整个查询都是基于这个假设构建的)。

我有一个包含100万行的表。有10列。第一列是id。每个ID都是" item" (在我的情况下是销售订单)但有多行。每行都是完全null或在其中一列中具有单个值。没有两个具有相同ID的行具有同一列的数据。我需要根据ID将这些多行合并为一行。但是,我需要保留空值。如果第一列在所有行中都为null,我需要将其保留在最终数据中。

有人可以帮我解决这个问题,我现在已经坚持了2个小时。

id - Age - firstname - lastname
1    13      null      null
1    null     chris    null

应输出

1 13 chris null

3 个答案:

答案 0 :(得分:3)

听起来你想要一个聚合查询:

select id, max(col1) as col1, max(col2) as col2, . . .
from t
group by id;

如果所有值均为NULL,则会生成NULL。如果其中一行(对于id)有一个值,那么这将产生该值。

答案 1 :(得分:2)

select id, max(col1), max(col2).. etc
from mytable
group by id

答案 2 :(得分:1)

正如其他人所提到的,你应该使用聚合查询来实现这一点。

select t1.id, max(t1.col1), max(t1.col2)
from tableone t1
group by t1.id 

这应该返回null。如果您在处理空值时遇到问题,可以使用ISNULL()实现一些逻辑。确保您的数据字段确实为空,而不是空字符串。

如果没有返回空值,请检查以确保具有特定ID的每一行都只有空值。如果其中一个返回一个空字符串,则是,它将删除null并返回null上的任何其他内容。