MySQL GROUP BY 数据并将分组数据分成列

标签 mysql

我有一个bus_pings表:

CREATE TABLE bus_pings(
    id int(12) unsigned NOT NULL AUTO_INCREMENT,
    ping_time DATETIME(3),
    line INT(10),
    speed DECIMAL(3,2),
    PRIMARY KEY (id)
);

我想获取按日期分组的平均速度,并为每个不同的行提供单独的列。 像这样:

DATE    LINE_74 LINE_96 LINE_86 LINE_91
2017-10-15  14,2868246445   14,719426483    16,1636562671   15,5332546242
2017-10-16  13,1164417178   14,214340589    14,7644345606   13,3649570639
2017-10-17  11,6387929133   12,2247682434   12,7987289148   11,5381412639

我可以使用此查询获取一行的平均速度:

SELECT DISTINCT DATE_FORMAT(ping_time, '%Y-%m-%d'), AVG(speed) as speed_average
FROM bus_pings
WHERE line=74
GROUP BY DATE_FORMAT(ping_time, '%Y-%m-%d')

但是我有很多公交线路,我需要在一次查询中查询所有线路。有什么优雅的解决方案吗?

最佳答案

您可以在此处使用数据透视查询:

SELECT
    DATE_FORMAT(ping_time, '%Y-%m-%d'),
    AVG(CASE WHEN line=74 THEN speed END) AS line_74_avg,
    AVG(CASE WHEN line=96 THEN speed END) AS line_96_avg,
    AVG(CASE WHEN line=86 THEN speed END) AS line_86_avg,
    AVG(CASE WHEN line=91 THEN speed END) AS line_91_avg
FROM bus_ping
WHERE line IN (74, 96, 86, 91)
GROUP BY
    DATE_FORMAT(ping_time, '%Y-%m-%d')

这里的基本思想是对表进行一次遍历,并使用 CASE 表达式有条件地取各行的平均值。

关于MySQL GROUP BY 数据并将分组数据分成列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49121939/

相关文章:

php - 插入 SQL 时保留 JSON 数据的顺序

mysql - 优化应用程序的 MySql Select

MYSQL 内连接与条件

mysql - 无需 SSH 隧道即可远程连接到 EC2 上的 MySQL

php - 如何从具有一对多关系的表中选择一行结果

MySQL/CakePHP 数据库设计问题

php - 需要帮助从数据库中获取值以用于表单

mysql - 如何将列数据移动到下一行直到从指定键开始结束

mysql - 连接两个查询并用于数值除法

php - MySQL - 获取同一列的多个值