我们应该如何聚合值,如果单个列中有两个值并且其余列包含 NULL 值,那么所有值都需要进行分组,并且列的其余部分应该显示 NULL 作为价值观
我们需要迭代每个列值,移动到顶部并将 NULL 值下一个/底部移动到该特定值,如果单个列中有两个值并且其余列包含 NULL 值,那么所有值都需要移动到顶部,将剩余的 NULL 值留在底部,如果一行中没有值,则它应该简单地显示为 NULL
考虑简单的 SQL 查询
SELECT
*
FROM
(
(SELECT
6 + 2 AS val1,
NULL AS val2,
NULL AS val3,
NULL AS val4,
5 + 5 AS val5,
NULL AS val6
FROM
DUAL)
UNION
(SELECT
NULL AS val1,
6 - 2 AS val2,
NULL AS val3,
NULL AS val4,
9 - 3 AS val5,
7 - 3 AS val6
FROM
DUAL)
UNION
(SELECT
NULL AS val1,
NULL AS val2,
6 * 2 AS val3,
NULL AS val4,
NULL AS val5,
NULL AS val6
FROM
DUAL)
UNION
(SELECT
NULL AS val1,
NULL AS val2,
NULL AS val3,
6 / 2 AS val4,
NULL AS val5,
NULL AS val6
FROM
DUAL)
) A;
实际结果:
+------+------+------+--------+------+------+
| val1 | val2 | val3 | val4 | val5 | val6 |
+------+------+------+--------+------+------+
| 8 | NULL | NULL | NULL | 10 | NULL |
| NULL | 4 | NULL | NULL | 6 | 4 |
| NULL | NULL | 12 | NULL | NULL | NULL |
| NULL | NULL | NULL | 3.0000 | NULL | NULL |
+------+------+------+--------+------+------+
4 rows in set (0.00 sec)
预期结果:
+------+------+------+--------+------+------+
| val1 | val2 | val3 | val4 | val5 | val6 |
+------+------+------+--------+------+------+
| 8 | 4 | 12 | 3.0000 | 10 | 4 |
| NULL | NULL | NULL | NULL | 6 | NULL |
+------+------+------+--------+------+------+
1 row in set (0.00 sec)
SQL 演示
编辑:
正如 Gordon Linoff 所说,在 MySQL 8+ 中可以使用 row_number() 和 joins 因为我期待通过 SQL Demo 获得满足预期结果的精确解决方案。由于帖子被搁置