如何根据MySQL中非空值的最大数量合并行

如何根据MySQL中非空值的最大数量合并行,mysql,sql,database,Mysql,Sql,Database,考虑下表 T c1 c2 c3 c4 ------------------- X NULL NULL NULL w NULL NULL NULL NULL y NULL NULL NULL Z NULL NULL NULL NULL P NULL NULL NULL NULL A NULL NULL Q NULL NULL NULL NULL B NULL NULL NULL C 现在我想要这样的输出 c1

考虑下表

T

 c1   c2   c3   c4
 -------------------
 X    NULL NULL NULL
 w    NULL NULL NULL 
 NULL y    NULL NULL 
 NULL Z    NULL NULL 
 NULL NULL P    NULL 
 NULL NULL NULL A 
 NULL NULL Q    NULL 
 NULL NULL NULL B 
 NULL NULL NULL C 
现在我想要这样的输出

 c1   c2   c3   c4
 -------------------
 x    Y    P    A
 w    z    Q    B
 NULL NULL NULL C
正如您所看到的,输出是基于跨列的非空值的最大数量显示的

有谁能帮助我如何使用mysql实现这一点吗

更新

行中只有一列值始终不为null,其余三列值始终为null

请尝试此查询:

SELECT 
MAX(CASE WHEN t.colName = 'C1' THEN t.f ELSE NULL END ) AS 'C1',
MAX(CASE WHEN t.colName = 'C2' THEN t.f ELSE NULL END ) AS 'C2',
MAX(CASE WHEN t.colName = 'C3' THEN t.f ELSE NULL END ) AS 'C3',
MAX(CASE WHEN t.colName = 'C4' THEN t.f ELSE NULL END ) AS 'C4'
FROM 
(
    SELECT c2 AS f,
      'C2' AS colName,
      @rn2 := @rn2 + 1 row_number
    FROM mergetable,(SELECT @rn2 := 0) var
    WHERE c2 IS NOT NULL

    UNION 

    SELECT c1,
      'C1' AS colName,
      @rn1 := @rn1 + 1 row_number
    FROM mergetable,(SELECT @rn1 := 0) var
    WHERE c1 IS NOT NULL

    UNION

    SELECT 
      c4,
      'C4' AS colName,
      @rn4 := @rn4 + 1 row_number
    FROM mergetable,(SELECT @rn4 := 0) var
    WHERE c4 IS NOT NULL

    UNION

    SELECT 
      c3,
      'C3' AS colName,
      @rn3 := @rn3 + 1 row_number
    FROM mergetable,(SELECT @rn3 := 0) var
    WHERE c3 IS NOT NULL 
) t
GROUP BY t.row_number;

请检查一下电话号码

说明:

f   colName   row_number
y     C2          1
z     C2          2
f  colName   row_number 
x    C1        1
w    C1        2
f  colName   row_number 
p    C3         1
Q    C3         2
f   colName   row_number
A     C4         1
B     C4         2
C     C4         3
考虑一个内部查询:

这里有一个:

SELECT c2 AS f,
'C2' AS colName,
@rn2 := @rn2 + 1 row_number
FROM mergetable,(SELECT @rn2 := 0) var
WHERE c2 IS NOT NULL;
列C2的输出:

f   colName   row_number
y     C2          1
z     C2          2
f  colName   row_number 
x    C1        1
w    C1        2
f  colName   row_number 
p    C3         1
Q    C3         2
f   colName   row_number
A     C4         1
B     C4         2
C     C4         3
实际上,上述每个内部查询都会给出一个相似的输出结构:

列C1的输出:

f   colName   row_number
y     C2          1
z     C2          2
f  colName   row_number 
x    C1        1
w    C1        2
f  colName   row_number 
p    C3         1
Q    C3         2
f   colName   row_number
A     C4         1
B     C4         2
C     C4         3
列C3的输出:

f   colName   row_number
y     C2          1
z     C2          2
f  colName   row_number 
x    C1        1
w    C1        2
f  colName   row_number 
p    C3         1
Q    C3         2
f   colName   row_number
A     C4         1
B     C4         2
C     C4         3
列C4的输出:

f   colName   row_number
y     C2          1
z     C2          2
f  colName   row_number 
x    C1        1
w    C1        2
f  colName   row_number 
p    C3         1
Q    C3         2
f   colName   row_number
A     C4         1
B     C4         2
C     C4         3
现在,如果您
UNION
将它们全部合并,您将得到如下输出结构:

f   colName   row_number
y     C2         1
z     C2         2
x     C1         1
w     C1         2
A     C4         1
B     C4         2
C     C4         3
p     C3         1
Q     C3         2
看,如果我没有在每个内部查询中使用列名列,那么现在就可以知道哪个值属于哪个列了


现在从上面的最终输出结构开始,如果您使用
旋转
,那么您可以很容易地导出预期的输出。

如果只填充一列,那么它看起来像是糟糕的设计。您可以添加2列,第一列将包含您当前作为列名输入的值,第二列将包含该值。@Nimesh这不是一个设计的表,但从pivot表查询生成的输出在此处阅读后,您将了解其用途,请参阅我知道pivot表是什么以及它是如何工作的,你提到这是一个表格,所以我添加了这个建议。这就是你应该相应地提及并提供代码的输出。顺便说一句,您是否使用了文章第4步中提到的
coalesce
来消除空值?@Nimesh对此表示抱歉,但是coalesce对我没有帮助,因为这里的数据不是int或number类型,此外,我也不要求对列执行聚合函数,正如您从预期输出中看到的那样。您的代码似乎工作得很好,请解释一下以下代码的作用是什么选择c2作为f,“c2”作为colName,@rn2:=@rn2+1行\u从mergetable中选择,(选择@rn2:=0)var,其中c2不为空我对Advanced SQL还是新手,请现在检查。我补充了解释@geeksalthanks我理解它的一部分,但我会推荐一个更清晰的解释或一些相同的教程链接。任何方式都接受了你的答案,但仍在努力学习这个概念。:)