考虑以下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。
答案 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
,那么你可以很容易地得到预期的输出。