loading..
Русский    English
13:14
листать

Упражнение 124

Среди пассажиров, которые пользовались услугами не менее двух авиакомпаний, найти тех, кто совершил одинаковое количество полётов самолетами каждой из этих авиакомпаний. Вывести имена таких пассажиров.

Эта задача порождает массу ошибочных решений, которые я разделяю на две группы. К первой группе относятся решения, связанные с неверным прочтением формулировки. Например, пытаются найти двух пассажиров, которые летали бы одинаково двумя или большим числом компаний.

Поясню, что рассматривать следует отдельного пассажира и подсчитываеть число полетов, которое он сделал каждой из авиакомпаний, которыми летал.

Что дальше? Рассмотрим теперь пример из второй группы ошибочных решений:

Консоль
Выполнить
  1. SELECT DISTINCT name
  2.  FROM (SELECT id_psg, id_comp, COUNT(pt.trip_no) AS CNT
  3.              FROM pass_in_trip pt JOIN trip t ON pt.trip_no=t.trip_no
  4.              GROUP BY id_comp,id_psg)a,
  5.            (SELECT id_psg, id_comp, COUNT(pt.trip_no) AS CNT
  6.             FROM pass_in_trip pt JOIN trip t ON pt.trip_no=t.trip_no
  7.             GROUP BY id_comp,id_psg)b,
  8.            passenger p
  9.  WHERE a.id_psg=b.id_psg AND a.id_comp<>b.id_comp AND a.cnt=b.cnt
  10.  AND p.id_psg=b.id_psg;

Сразу отметим ошибочное DISTINCT name, которое устраняет возможных однофамильцев. Однако не это здесь главное. В предложении FROM соединяются два одинаковых запроса

Консоль
Выполнить
  1. SELECT id_psg, id_comp, COUNT(pt.trip_no) AS CNT
  2. FROM pass_in_trip pt JOIN trip t ON pt.trip_no=t.trip_no
  3. GROUP BY id_comp,id_psg;
которые, как и сказано выше, подсчитывают для каждого пассажира число полетов, которое он совершил самолетами каждой из компаний.

Соединяются эти запросы по следующим условиям:

  • пассажир тот же самый;
  • компании разные;
  • число полетов совпадает.

Итак, если пассажир совершил, скажем, компанией Aeroflot 3 полета, и также 3 полета он совершил самолетами компании Don_avia, то такой пассажир удовлетворяет условиям соединения и будет выведен в результатах запроса. Если пассажир летал всего двумя компаниями, то это - правильный результат. А если компании три?

Если в результате рассмотренного выше подзапроса мы получим

Bruce Willis       Don_avia         2
Bruce Willis       Aeroflot          2
Bruce Willis        Dale_avia        1
то пассажир Bruce Willis не отвечает условиям задачи, хотя рассматриваемый запрос выведет его, поскольку в запросе будут соединены первые две строки.

Итак, число полетов пассажира каждой из компаний, которыми он летал, должно находиться в пропорции 1:1:...1.

Решить задачу на SQL-EX.RU

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100