mysql - 如何编写此 SQL 查询?

标签 mysql sql

我想知道是否可以就此 sql 查询获得一些帮助。它来 self 失败的测试,现在想学习。我在上面花了很多时间,看了有关 sql 的教程,但我仍然不明白它是如何编写的。

有 2 个表(flights,occupation_flights)包含航类信息,任务是:编写一个查询,给出接下来 7 天的航类列表,并显示航类、可用座位数、占用人数席位和已占用席位的百分比。

FLIGHTS:                    
FLIGHT  ID_COMPANY   DATE      ORIGIN   DESTINATION PLACES
1003       D3      20/01/2006   MADRID  LONDRES       40
1007       AF      20/01/2006   PARIS   MALAGA        12
1003       15      30/01/2006   MADRID  LONDRES       20
1007       AF      30/01/2006   PARIS   MALAGA        17

(PLACES 显示每个航类提供的座位数)

OCCUPATION_FLIGHTS:
FLIGHT ID_COMPANY   DATE    PASSENGER   SEAT
1003    IB       20/01/2006 07345128H   01V
1003    IB       20/01/2006 1013456213  01P
1003    IB       20/01/2006 08124356C   02V
1003    IB       20/01/2006 57176355K   02P
1007    AF       20/01/2006 27365138A   
1003    IB       30/01/2006 734512811   01V
1003    IB       30/01/2006 1013456213  02V
1003    IB       30/01/2006 57176355K   

(当SEAT为空时,表示还没有人出票)。 TEST DATA 我想获得一些可用座位,我应该总结每个航类和日期乘客不空的情况,并从 PLACES 中提取。 所以我从以下开始:

SELECT 
f.flight, 
f.places - (SELECT (CASE WHEN of.passanger IS NOT NULL THEN 1 ELSE 0 END)      
FROM occupation_flights AS of GROUP BY of.flight, of.date) AS available,
f.places - (SELECT (CASE WHEN of.passanger IS NULL THEN 1 ELSE 0 END) FROM occupation_flights AS of GROUP BY of.flight, of.date) AS occupied,
100.0 * ((f.places - (SELECT (CASE WHEN of.passanger IS NOT NULL THEN 1 ELSE 0 END) FROM occupation_flights AS of GROUP BY of.flight, of.date)) / f.places AS %occupied
FROM flights AS f
JOIN occupation_flights AS of ON f.flight=of.flight
WHERE f.date BETWEEN DateAdd(DD,-7,GETDATE() ) and GETDATE() 
GROUP BY f.flight

但是还没完,因为我实在不明白怎么让他同时按航类和日期分组计算,因为有航类号相同但去的日期不同的航类。我也无权访问表,测试是在纸上进行的,以表明您知道如何编写 sql 查询。 真的很感激任何见解! 非常感谢!

最佳答案

Mysql符合: SQLFIDDLE

SELECT f.flight,f.mydate,f.places - count(of.seat) as available_seats,
        count(of.seat) as occupied,
        count(of.seat)/f.places * 100 as percentage_occupied
FROM flights f
JOIN occupation_flights of
ON f.flight = of.flight AND f.mydate = of.mydate
WHERE of.mydate BETWEEN DATE_ADD(CURDATE(), INTERVAL -7 DAY)AND CURDATE() 
group by f.flight, f.mydate

关于mysql - 如何编写此 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570289/

相关文章:

mysql - 为什么在 MySQL 触发器查询中出现语法错误?

php - 如何在连接表中搜索?

sql - 如何找出哪些 SQL 查询被阻止以及哪些内容阻止了它们?

mysql - 在sql中检索最新日期时间条目的复杂性?

Mysql 子查询从许多数据库返回多于 1 行

java - 删除查询时 Hibernate 版本更新后子树意外结束异常

c# - 如何使用散列密码连接到 MySQL 数据库

python - 在 Django 中使用 MySQLdb 的 MySQL 响应中的缓存问题

php - 如何在mysql中从多选中插入数据

mysql - 在 Windows Vista 上安装 MySQL(使用 IIS)