SELECT s2.model,
string_agg(
s2.fare_conditions || ' (' || s2.num || ')', ', '
)
FROM (
SELECT a.model,
s.fare_conditions,
count( * ) AS num
FROM aircrafts a
JOIN seats s ON a.aircraft_code = s.aircraft_code
GROUP BY 1, 2
ORDER BY 1, 2
) AS s2
GROUP BY s2.model
ORDER BY s2.model;
Подзапрос формирует временную таблицу в таком виде:
model
| fare_conditions | num
---------------------+-----------------+-----
Airbus A319-100
| Business
| 20
Airbus A319-100
| Economy
| 96
Airbus A320-200
| Business
| 20
Airbus A320-200
| Economy
| 120
...
Sukhoi SuperJet-100 | Business
| 12
Sukhoi SuperJet-100 | Economy
| 85
(17 строк)
А в главном (внешнем) запросе используется агрегатная функция string_agg для фор-
мирования результирующего значения на основе сгруппированных строк. Эта функ-
ция отличается от агрегатных функций avg, min, max, sum и count тем, что она воз-
вращает не числовое значение, а строку символов, составленную из значений атрибу-
тов, указанных в качестве ее параметров. Эти значения берутся из сгруппированных
строк.
model
|
string_agg
---------------------+--------------------------------------------
Airbus A319-100
| Business (20), Economy (96)
Airbus A320-200
| Business (20), Economy (120)
Airbus A321-200
| Business (28), Economy (142)
Boeing 737-300
| Business (12), Economy (118)
Boeing 767-300
| Business (30), Economy (192)
Boeing 777-300
| Business (30), Comfort (48), Economy (324)
Bombardier CRJ-200 | Economy (50)
Cessna 208 Caravan | Economy (12)
Sukhoi SuperJet-100 | Business (12), Economy (85)
(9 строк)
В качестве еще одного примера использования подзапроса в предложении FROM ре-
шим такую задачу: получить перечень аэропортов в тех городах, в которых больше
одного аэропорта.
Достарыңызбен бөлісу: