У меня есть таблица с 2 столбцами: модель и цена

Model       Price
Pilot       30
Civic       20
Highlander  10
Corolla     40
Rav4        25

Я знаю, что Pilot и Civic - это автомобиль Honda, а Highlander, Corolla, Rav4 - это Toyota. Я хочу рассчитать, скажем, среднюю цену для Honda Group (30 + 20) / 2 и Toyota (10 + 40 + 25) / 3.

Выходная таблица:

Mode    Average_price
Honda   25
Toyota  25

Моя проблема в том, что мне НЕ разрешено создавать новую таблицу или новый столбец в существующей таблице.

Таким образом, я думаю, что где-то в запросе мне нужно перечислить все условия сказать

IF Model in ('Pilot','Civic') then Manufacturer='Honda' else if Model in ('Highlander','Corolla','Rav4') then Manufacturer='Toyota'
Then average by Manufacturer.

Может кто-нибудь, пожалуйста, помогите мне написать запрос?

Спасибо,

Гарри

sql
0
Harry 15 Фев 2020 в 23:32

2 ответа

Лучший ответ

Вы можете использовать выражение case:

select 
    case 
        when model in ('Pilot', 'Civic') then 'Honda'
        when model in ('Highlander', 'Corolla', 'Rav4') then 'Toyota'
    end mode,
    avg(price) avg_price
from mytable
group by
    case 
        when model in ('Pilot', 'Civic') then 'Honda'
        when model in ('Highlander', 'Corolla', 'Rav4') then 'Toyota'
    end 

Некоторые базы данных расширяют стандарт SQL, позволяя использовать псевдонимы в предложении group by (например, MySQL), поэтому вы можете упростить его следующим образом:

group by mode
1
GMB 15 Фев 2020 в 20:52

Как насчет общего табличного выражения?

;WITH hondaCTE AS (
    SELECT 'Honda' AS [make]
    ,   SUM(ct.Price) / COUNT(1) AS [avg_price]
    FROM car_table AS ct
    WHERE ct.Model IN ('pilot','civic')
)
, toyotaCTE AS (
    SELECT 'Toyota' AS [make]
    ,   SUM(ct.Price) / COUNT(1) AS [avg_price]
    FROM car_table AS ct
    WHERE ct.Model NOT IN ('pilot','civic') -- Exclude Honda models
)
-- Union results
SELECT * FROM hondaCTE
UNION
SELECT * FROM toyotaCTE

Выход:

make    avg_price
Honda   25
Toyota  25
0
Mark Moretto 15 Фев 2020 в 20:50