mysql - MySQL Count on 按子查询分组
问题描述
我正在尝试对某些航班(称为腿)进行 SQL 查询。目标是了解有多少航班准时,有多少航班延误 5 到 15 分钟,有多少航班超过 15 分钟。
使用子查询,我设法得到了第一个结果:
SELECT
count(*) as 'leg total',
leg2.l2count as 'less than 15min delay',
round(leg2.l2count / count(*) * 100, 2) as 'less than 15min delay percentage',
leg3.l3count as 'more than 15min delay',
round(leg3.l3count / count(*) * 100, 2) as 'more than 15min delay percentage',
count(*) - leg2.l2count - leg3.l3count as 'on time',
round((count(*) - leg2.l2count - leg3.l3count) / count(*) * 100, 2) as 'on time percentage'
FROM TBL_leg leg -- previsional dates
JOIN TBL_flight_reports fr ON leg.id = fr.leg_ops_id, -- realized dates
(
SELECT count(l2.id) as l2count
FROM TBL_leg l2
JOIN TBL_flight_reports fr2 ON l2.id = fr2.leg_ops_id
WHERE (
timediff(fr2.arrival_date_block, l2.to_date_time) > SEC_TO_TIME(5*60) AND
timediff(fr2.arrival_date_block, l2.to_date_time) < SEC_TO_TIME(15*60)
)
OR (
timediff(fr2.departure_date_block, l2.start_date_time) > SEC_TO_TIME(5*60) AND
timediff(fr2.departure_date_block, l2.start_date_time) < SEC_TO_TIME(15*60)
)
) leg2, -- delays between threshold and 15min
(
SELECT count(l3.id) as l3count
FROM TBL_leg l3
JOIN TBL_flight_reports fr3 ON l3.id = fr3.leg_ops_id
WHERE (
timediff(fr3.arrival_date_block, l3.to_date_time) > SEC_TO_TIME(15*60)
)
OR (
timediff(fr3.departure_date_block, l3.start_date_time) > SEC_TO_TIME(15*60)
)
) leg3 -- delays of more than 15min
;
这个查询似乎很好。
现在,我正在尝试对我的结果进行排序:在我的 TBL_leg 表中,有一个 plane_id 列,我想按它对我的结果进行分组。目标是让我的飞机延误。
问题是在我的子查询中进行分组。我在那里缺少一些逻辑。
另外,如果您对我的主要问题(我当前的查询)有更好的解决方案,请随意:)
问候
解决方案
确保每个子查询都按飞机 ID 分组,并将飞机 ID 添加到子查询的选择中,然后按飞机 ID 加入。
例如第二条腿:
left join (
SELECT l2.airplane_id, count(l2.id) as l2count
FROM TBL_leg l2
JOIN TBL_flight_reports fr2 ON l2.id = fr2.leg_ops_id
WHERE (
timediff(fr2.arrival_date_block, l2.to_date_time) > SEC_TO_TIME(5*60) AND
timediff(fr2.arrival_date_block, l2.to_date_time) < SEC_TO_TIME(15*60)
)
OR (
timediff(fr2.departure_date_block, l2.start_date_time) > SEC_TO_TIME(5*60) AND
timediff(fr2.departure_date_block, l2.start_date_time) < SEC_TO_TIME(15*60)
)
GROUP BY l2.airplane_id
) leg2 ON leg.airplane_id = leg2.airplane_id
也对 plane_id 上的总查询进行分组。
推荐阅读
- javascript - 如何禁用负值并允许输入类型数字的十进制值?
- java - 如何动态判断Java程序的运行时内存使用情况?
- mysql - 从到达和离开日期选择未预订的房间
- canvas - 如何在画布中沿路径涂抹 svg?
- javascript - 为什么我的
ReactJS 项目中的组件看不到任何道具? - excel - 如何根据另一张工作表中的数据替换自动填充范围
- python - 使用knitr编织时无法在RStudio中使用网状导入geopandas
- android - android-ndk 位于哪里?
- amazon-web-services - 使用 java 的 Kinesis 跨账户访问
- php - Laravel 存储删除/清理在生产服务器上不起作用