mysql查询出来的一列当列名,另一列当值

现在有一个表格,一列名为“日期”,一列名为“分数”,同一天会有多条分数。

查询得到相同的日期的分数为一列,这一列的列名改为日期。

最后得到的表格应该是列名为每一天的日期,列里填写的是日期对应的各个分数。

结果;

img


代码:

CREATE TABLE scores (
    date DATE, 
    score INT
);

INSERT INTO scores VALUES 
    ('2020-01-01', 80),
    ('2020-01-01', 90),
    ('2020-01-02', 70),
    ('2020-01-02', 60),
    ('2020-01-03', 50),
    ('2020-01-03', 40);

SELECT 
    date, 
    GROUP_CONCAT(score) AS date 
FROM scores 
GROUP BY date;


groupby groupconcat

可以使用 MySQL 的 GROUP_CONCAT 函数和动态 SQL 去实现这个功能。以下是示例代码:

-- 创建测试表格
CREATE TABLE score (
  id INT PRIMARY KEY AUTO_INCREMENT,
  date DATE,
  value INT
);
 
-- 插入测试数据
INSERT INTO score (date, value) VALUES ('2022-07-01', 10),('2022-07-01', 20),('2022-07-02', 30),('2022-07-03', 40),('2022-07-03', 50);
 
-- 查询相同日期的分数并按日期分组,并将日期作为列名
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
         CONCAT('MAX(IF(date = ''', date,''', value, NULL)) AS ''', date, '''')
        ) INTO @sql
FROM score;
 
SET @sql = CONCAT('SELECT ', @sql, ' FROM score GROUP BY date');
 
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

解释一下这个语句的过程:

首先,我们创建了一个测试表格和测试数据。然后,使用 GROUP_CONCAT 和 CONCAT 函数动态地生成 SQL 查询语句,将相同日期的分数聚合为一列,并以日期为列名。最后,使用动态 SQL 执行查询语句,得到最终的结果。

在这个例子中,得到的查询结果表格应该包含“2022-07-01”、“2022-07-02”、“2022-07-03”三列,每列分别对应相应日期的分数值。其中,“2022-07-01”列的值应该为“10,20”,“2022-07-02”列的值应该为“30”,“2022-07-03”列的值应该为“40,50”。