пятница, 17 апреля 2020 г.

Для каждой страны определить сражения, в которых не участвовали корабли данной страны.

Задание: 73 (Serge I: 2009-04-17)

Вывод: страна, сражение
SELECT DISTINCT c.country, b.name
FROM battles b, classes c
MINUS
SELECT c.country, o.battle
FROM outcomes o
LEFT JOIN ships s ON s.name = o.ship
LEFT JOIN classes c ON o.ship = c.class OR s.class = c.class
WHERE c.country IS NOT NULL
GROUP BY c.country, o.battle

Среди тех, кто пользуется услугами только какой-нибудь одной компании, определить имена разных пассажиров, летавших чаще других.

Задание: 72 (Serge I: 2003-04-29)

Вывести: имя пассажира и число полетов.
select TOP 1 WITH TIES name, c3 from passenger
join
(select c1, max(c3) c3 from
(
select pass_in_trip.ID_psg c1, Trip.ID_comp c2, count(*) c3 from pass_in_trip
join trip on trip.trip_no=pass_in_trip.trip_no
group by pass_in_trip.ID_psg, Trip.ID_comp
) as t
group by c1
having count(*)=1) as tt
on ID_psg=c1
order by c3 desc

Найти тех производителей ПК, все модели ПК которых имеются в таблице PC.

Задание: 71 (Serge I: 2008-02-23)
Найти тех производителей ПК, все модели ПК которых имеются в таблице PC.
SELECT p.maker
FROM product p
LEFT JOIN pc ON pc.model = p.model
WHERE p.type = 'PC'
GROUP BY p.maker
HAVING COUNT(p.model) = COUNT(pc.model)

Укажите сражения, в которых участвовало по меньшей мере три корабля одной и той же страны.

Задание: 70 (Serge I: 2003-02-14)
Укажите сражения, в которых участвовало по меньшей мере три корабля одной и той же страны.
SELECT DISTINCT o.battle
FROM outcomes o
LEFT JOIN ships s ON s.name = o.ship
LEFT JOIN classes c ON o.ship = c.class OR s.class = c.class
WHERE c.country IS NOT NULL
GROUP BY c.country, o.battle
HAVING COUNT(o.ship) >= 3

По таблицам Income и Outcome для каждого пункта приема найти остатки денежных средств на конец каждого дня

Задание: 69 (Serge I: 2011-01-06)
По таблицам Income и Outcome для каждого пункта приема найти остатки денежных средств на конец каждого дня, 
в который выполнялись операции по приходу и/или расходу на данном пункте. 
Учесть при этом, что деньги не изымаются, а остатки/задолженность переходят на следующий день. 
Вывод: пункт приема, день в формате "dd/mm/yyyy", остатки/задолженность на конец этого дня.
with t as
(
  select point, "date", inc, 0 AS "out" from income
  union all
  select point, "date", 0 AS inc, "out" from outcome
)
SELECT t.point, TO_CHAR ( t."date", 'DD/MM/YYYY') AS day,
 ( select SUM(i.inc) from t i
   where i."date" <= t."date" and i.point = t.point )
-
( select SUM(i."out") from t i
  where i."date" <= t."date" and i.point = t.point ) AS rem
from t
group by t.point, t."date"

Найти количество маршрутов, которые обслуживаются наибольшим числом рейсов.

Задание: 68 (Serge I: 2010-03-27)
Найти количество маршрутов, которые обслуживаются наибольшим числом рейсов. 
Замечания. 
1) A - B и B - A считать ОДНИМ И ТЕМ ЖЕ маршрутом. 
2) Использовать только таблицу Trip
select count(*) from (
select TOP 1 WITH TIES sum(c) cc, c1, c2 from (
SELECT count(*) c, town_from c1, town_to c2 from trip
where town_from>=town_to
group by town_from, town_to
union all
SELECT count(*) c,town_to, town_from from trip
where town_to>town_from
group by town_from, town_to
) as t
group by c1,c2
order by cc desc
) as tt

Найти количество маршрутов, которые обслуживаются наибольшим числом рейсов

Задание: 67 (Serge I: 2010-03-27)
Найти количество маршрутов, которые обслуживаются наибольшим числом рейсов. 
Замечания. 
1) A - B и B - A считать РАЗНЫМИ маршрутами. 
2) Использовать только таблицу Trip
select count(*) from
(SELECT TOP 1 WITH TIES count(*) c, town_from, town_to from trip
group by town_from, town_to
order by c desc) as t

Для всех дней в интервале с 01/04/2003 по 07/04/2003 определить число рейсов из Rostov.

Задание: 66 (Serge I: 2003-04-09)
Для всех дней в интервале с 01/04/2003 по 07/04/2003 определить число рейсов из Rostov. 
Вывод: дата, количество рейсов
SELECT date, max(c) FROM
(SELECT date,count(*) AS c FROM Trip,
(SELECT trip_no,date FROM Pass_in_trip WHERE date>='2003-04-01' AND date<='2003-04-07' GROUP BY trip_no, date) AS t1
WHERE Trip.trip_no=t1.trip_no AND town_from='Rostov'
GROUP BY date
UNION ALL
SELECT '2003-04-01',0
UNION ALL
SELECT '2003-04-02',0
UNION ALL
SELECT '2003-04-03',0
UNION ALL
SELECT '2003-04-04',0
UNION ALL
SELECT '2003-04-05',0
UNION ALL
SELECT '2003-04-06',0
UNION ALL
SELECT '2003-04-07',0) AS t2
GROUP BY date

Пронумеровать уникальные пары {maker, type} из Product, упорядочив их следующим образом:

Задание: 65 (Serge I: 2009-08-24)
Пронумеровать уникальные пары {maker, type} из Product, упорядочив их следующим образом: 
- имя производителя (maker) по возрастанию; 
- тип продукта (type) в порядке PC, Laptop, Printer. 
Если некий производитель выпускает несколько типов продукции, то выводить его имя только в первой строке; 
остальные строки для ЭТОГО производителя должны содержать пустую строку символов ().
SELECT row_number() over(ORDER BY maker,s),t, type FROM
(SELECT maker,type,
CASE
WHEN type='PC'
THEN 0
WHEN type='Laptop'
THEN 1
ELSE 2
END AS s,
CASE
WHEN type='Laptop' AND (maker in (SELECT maker FROM Product WHERE
type='PC'))
THEN 

WHEN type='Printer' AND ((maker in (SELECT maker FROM Product WHERE
type='PC')) OR (maker in (SELECT maker FROM Product WHERE
type='Laptop')))
THEN ''
ELSE maker
END AS t
FROM Product
GROUP BY maker,type) AS t1
ORDER BY maker, s

Используя таблицы Income и Outcome, для каждого пункта приема определить дни, когда был приход, но не было расхода и наоборот.

Задание: 64 (Serge I: 2010-06-04)

Вывод: пункт, дата, тип операции (inc/out), денежная сумма за день.
SELECT i1.point, i1.date, 'inc', sum(inc) FROM Income,
(SELECT point, date FROM Income
EXCEPT
SELECT Income.point, Income.date FROM Income
JOIN Outcome ON (Income.point=Outcome.point) AND
(Income.date=Outcome.date)
) AS i1
WHERE i1.point=Income.point AND i1.date=Income.date
GROUP BY i1.point, i1.date
UNION
SELECT o1.point, o1.date, 'out', sum(out) FROM Outcome,
(SELECT point, date FROM Outcome
EXCEPT
SELECT Income.point, Income.date FROM Income
JOIN Outcome ON (Income.point=Outcome.point) AND
(Income.date=Outcome.date)
) AS o1
WHERE o1.point=Outcome.point AND o1.date=Outcome.date
GROUP BY o1.point, o1.date