MySQL按数据分组并将分组数据分隔为列

MySQL按数据分组并将分组数据分隔为列,mysql,Mysql,我有一张公共汽车桌: 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

我有一张公共汽车桌:

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')

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

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

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
表达式有条件地取各行的平均值。

下面是一个有效的查询

SELECT line
     , DATE_FORMAT(ping_time, '%Y-%m-%d')
     , AVG(speed) speed_average
  FROM bus_pings
 GROUP 
    BY line
     , DATE_FORMAT(ping_time, '%Y-%m-%d');

其他一切都应该在应用程序代码中处理。

这里有一个有效的查询

SELECT line
     , DATE_FORMAT(ping_time, '%Y-%m-%d')
     , AVG(speed) speed_average
  FROM bus_pings
 GROUP 
    BY line
     , DATE_FORMAT(ping_time, '%Y-%m-%d');

在应用程序代码中应处理其他事项。

认真考虑应用程序代码中数据显示的问题,这有什么特殊的原因吗?可扩展性、灵活性和易用性。有什么特别的吗?可伸缩性对我来说很重要,我有超过1亿的ping。谢谢。认真考虑应用程序代码中数据显示的问题,这有什么特殊的原因吗?可扩展性、灵活性和易用性。有什么特别的吗?可伸缩性对我来说很重要,我有超过1亿的ping。谢谢。好的,蒂姆,这很好用!但万一我有100多条公交线路。有没有办法执行子查询来最小化此代码?@AlexandreStrapacaoG.Vianna那么您可能需要动态SQL来处理此情况。好的,Tim,这很好!但万一我有100多条公交线路。有没有办法执行子查询来最小化此代码?@AlexandreStrapacaoG.Vianna那么您可能需要动态SQL来处理此情况。