-2

我们应该如何聚合值,如果单个列中有两个值并且其余列包含 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 获得满足预期结果的精确解决方案。由于帖子被搁置

4

2 回答 2

1

在 MySQL 8+ 中,您可以使用row_number()和连接:

select t1.val1, t2.val2, t3.val3, . . .
from (select row_number() over (order by (val1 is not null asc) as seqnum, t.*
      from t
     ) t1 join
     (select row_number() over (order by (val2 is not null asc) as seqnum, t.*
      from t
     ) t2
     on t1.seqnum = t2.seqnum join
     (select row_number() over (order by (val3 is not null asc) as seqnum, t.*
      from t
     ) t3
     on t1.seqnum = t3.seqnum join
     . . .
order by t1.seqnum;

这不会保留行的原始顺序。它只是将NULL值移动到“结束”。

于 2019-09-09T11:53:23.923 回答
0

那么你可以尝试使用GROUP_CONCAT()

Select 
  GROUP_CONCAT(val1) as val1,
  GROUP_CONCAT(val2) as val2,
  GROUP_CONCAT(val3) as val3,
  GROUP_CONCAT(val4) as val4,
  GROUP_CONCAT(val5) as val5,
  GROUP_CONCAT(val6) as val6
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;

SQL 演示

于 2019-09-09T11:55:43.193 回答