繁体   English   中英

如何将 SQL 表中的所有值转换为具有多列的单行

[英]How to transform all the values in a SQL table into a single row with multiple columns

我需要创建下表的视图

学生 分数
詹姆士 500
杰克 200
吉米 100

变成这样

学生_1 标记_1 学生_2 标记_2 学生_3 Marks_3
詹姆士 500 杰克 200 吉米 100

我是 SQL 的新手,我正在集思广益如何做到这一点,但我无法弄清楚。 任何帮助将不胜感激,谢谢。

这是您案例的示例。 您可以使用PREPARE语句

SELECT CONCAT( "SELECT ",
     GROUP_CONCAT(
     CONCAT('"',Student,'"'),CONCAT(' AS "Student_',@Nr:=@Nr+1,'", ')
    ,CONCAT('"',Marks,'"'),CONCAT(' AS "Marks_',@Nr,'" ')  SEPARATOR ' , ')
    ," FROM DUAL;") INTO @myquery
FROM stud
CROSS JOIN (SELECT @Nr:=0) as Init
ORDER BY Marks DESC;


## ONLY FOR DEBUG
SELECT @myquery;

PREPARE stmt FROM @myquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

样本

MariaDB [Bernd]> SELECT * from stud;
+----+---------+-------+
| id | Student | Marks |
+----+---------+-------+
|  1 | James   |   500 |
|  2 | Jack    |   200 |
|  3 | Jimmy   |   100 |
+----+---------+-------+
3 rows in set (0.01 sec)

MariaDB [Bernd]> SELECT CONCAT( "SELECT ",
    ->  GROUP_CONCAT(
    ->  CONCAT('"',Student,'"'),CONCAT(' AS "Student_',@Nr:=@Nr+1,'", ')
    -> ,CONCAT('"',Marks,'"'),CONCAT(' AS "Marks_',@Nr,'" ')  SEPARATOR ' , ')
    -> ," FROM DUAL;") INTO @myquery
    -> FROM stud
    -> CROSS JOIN (SELECT @Nr:=0) as Init
    -> ORDER BY Marks DESC;
Query OK, 1 row affected (0.00 sec)
    
MariaDB [Bernd]> ## ONLY FOR DEBUG
MariaDB [Bernd]> SELECT @myquery;
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| @myquery                                                                                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT "James" AS "Student_1", "500" AS "Marks_1"  , "Jack" AS "Student_2", "200" AS "Marks_2"  , "Jimmy" AS "Student_3", "100" AS "Marks_3"  FROM DUAL; |
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
    
MariaDB [Bernd]> PREPARE stmt FROM @myquery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

MariaDB [Bernd]> EXECUTE stmt;
+-----------+---------+-----------+---------+-----------+---------+
| Student_1 | Marks_1 | Student_2 | Marks_2 | Student_3 | Marks_3 |
+-----------+---------+-----------+---------+-----------+---------+
| James     | 500     | Jack      | 200     | Jimmy     | 100     |
+-----------+---------+-----------+---------+-----------+---------+
1 row in set (0.00 sec)

MariaDB [Bernd]> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Bernd]> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM