我从一个庞大的查询中得到以下结构,其中每列都有子查询。目标是首先为每个列提供非NULL值。
+-----+--------+--------+--------+-------+
| id | val1 | val2 | val3 | val4 |
+-----+--------+--------+--------+-------+
| 1 | STR1 | NULL | NULL | NULL |
| 1 | NULL | STR2 | NULL | NULL |
| 1 | NULL | NULL | STR3 | NULL |
| 1 | NULL | NULL | NULL | STR4 |
| 2 | STR1 | NULL | NULL | NULL |
| 2 | NULL | STR2 | NULL | NULL |
+-----+--------+--------+--------+-------+
所需结果:
+-----+--------+--------+--------+-------+
| id | val1 | val2 | val3 | val4 |
+-----+--------+--------+--------+-------+
| 1 | STR1 | STR2 | STR3 | STR4 |
| 2 | STR1 | STR2 | NULL | NULL |
+-----+--------+--------+--------+-------+
我的目标是按ID分组,但首先要查询所有非NULL字段。我尝试将其与MAX
函数和GROUP_CONCAT
函数一起使用,但两者都不是我要搜索的。
您对如何实现此目标有想法吗?非常感谢您的帮助。
最佳内线
edit:以正确的顺序与max一起解决。很抱歉,我为此感到有些as愧。
答案 0 :(得分:1)
在SQL中,不同行之间没有“第一”和“最后”之类的东西。
您要的东西看起来就像是COALESCE,它们出现在列中(针对某些特定的行子集)出现在某些值系列上。
但是,由于COALESCE的定义取决于排序,并且SQL没有[在行之间]这样的排序的概念,因此您所定义的要求不存在。
您需要做的是确定所需的顺序,并以SQL表示。只有这样做之后,您使用的“第一”这个词才能具有任何含义。
答案 1 :(得分:0)
使用聚合
select id,max(val1) as val1,
max(val2) as val2,max(val3) as val3,
max(val4) as val4
from table group by id
答案 2 :(得分:0)
从表顺序中选择id,val1,val2,val3,val4,由val1,val2,val3,val4为空;