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

时间:2016-04-05 17:02:57

标签: mysql sql database

考虑以下mysql表

Ť

 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。

1 个答案:

答案 0 :(得分:1)

请尝试此查询:

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;

请查看DEMO HERE

<强>解释

考虑一个INNER查询:

这是一个:

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

实际上,上述每个内部查询都会给出类似的输出结构:

C1列的输出:

f  colName   row_number 
x    C1        1
w    C1        2

C3列的输出:

f  colName   row_number 
p    C3         1
Q    C3         2

列C4的输出:

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

看,如果我没有在每个内部查询中使用列名列,那么现在可以知道哪个值属于哪个列。

现在从上面的最终输出结构中,如果你使用pivoting,那么你可以很容易地得到预期的输出。