如何根据MySQL中非空值的最大数量合并行
考虑下表 T如何根据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
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我理解它的一部分,但我会推荐一个更清晰的解释或一些相同的教程链接。任何方式都接受了你的答案,但仍在努力学习这个概念。:)