现在有一个表格,一列名为“日期”,一列名为“分数”,同一天会有多条分数。
查询得到相同的日期的分数为一列,这一列的列名改为日期。
最后得到的表格应该是列名为每一天的日期,列里填写的是日期对应的各个分数。
结果;
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”。