如何在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我在那里编辑我的答案并添加动态生成的查询。希望对你有所帮助!