如何在Mysql中获取作为列名的行值
我需要以下场景的帮助。我们如何动态地将行中的不同值作为列名获取 我有以下格式的数据如何在Mysql中获取作为列名的行值,mysql,Mysql,我需要以下场景的帮助。我们如何动态地将行中的不同值作为列名获取 我有以下格式的数据 Sno firstName Subject Marks 1 ABC Eng 10 2 PQR Hindi 20 3 LM Telgu 20 4 LM Hindi 20 5 LM Eng 39 我需要以下格式的输出 Sno Fi
Sno firstName Subject Marks
1 ABC Eng 10
2 PQR Hindi 20
3 LM Telgu 20
4 LM Hindi 20
5 LM Eng 39
我需要以下格式的输出
Sno FirstName Eng Hindi Telgu
1 ABC 10 Null Null
2 PQR Null 20 Null
3 LM 39 20 20
若再添加一个主题,那个么查询的编写应该足够动态,以包含这些值
如何为此编写查询?您好,正如Abecee在评论中告诉您的,您的问题的解决方案是数据透视表 这是您的查询表
SELECT Sno, firstName,
SUM(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) AS Eng,
SUM(CASE WHEN Subject = 'Hindi' THEN Marks ELSE NULL END) AS Hindy,
SUM(CASE WHEN Subject = 'Telgu' THEN Marks ELSE NULL END) AS Telgu
FROM t1
GROUP BY firstName
ORDER BY Sno
这里是为了看看它是如何工作的
德国劳埃德船级社
编辑:
好的,根据蓝脚怪的回答,这里是你们问题的动力学解决方案
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN Subject = ''',
Subject,
''' THEN Marks ELSE NULL END) AS ',
REPLACE(Subject, ' ', ''))) INTO @sql
FROM t1;
SET @sql = CONCAT('SELECT Sno, firstName, ', @sql, '
FROM t1
GROUP BY firstName
ORDER BY Sno');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
第一部分
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN Subject = ''',
Subject,
''' THEN Marks ELSE NULL END) AS ',
REPLACE(Subject, ' ', ''))) INTO @sql
FROM t1;
是动态创建我编写的第一个查询的这一部分
SUM(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) AS Eng,
SUM(CASE WHEN Subject = 'Hindi' THEN Marks ELSE NULL END) AS Hindy,
SUM(CASE WHEN Subject = 'Telgu' THEN Marks ELSE NULL END) AS Telgu
第二部分是创建准备好的语句,并将动态创建的部分包含到该语句中
SELECT Sno, firstName,
-- here you add dynamically created part @sql
FROM t1
GROUP BY firstName
ORDER BY Sno
在代码的这一部分中,您可以使用CONCAT实现这一点
SET @sql = CONCAT('SELECT Sno, firstName, ', @sql, '
FROM t1
GROUP BY firstName
ORDER BY Sno');
当您从该字符串创建它时,您准备语句并执行它
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
希望现在有点清楚了
下面是一个示例,您可以比较这两个查询并了解其工作原理
德国劳埃德船级社
另外,如果您有任何问题,请在下面的评论中自由填写。您需要进一步澄清您的问题。。。您的问题是关于从这些表中获取不同的名字吗?请将问题弄清楚,并尝试使用表格格式来显示表格。未排序的表数据看起来非常糟糕且无法读取。可能与或重复。谢谢,但我需要动态地将行名称作为列名…不应为我分配alies name…@user3751091 Hi我在那里编辑我的答案并添加动态生成的查询。希望对你有所帮助!