ПЕРЕД РАЗВИТИЕМ СУММОЙ - PullRequest
1 голос
/ 04 марта 2020

У меня есть таблица с владельцами, авто, цена . В одном запросе (с использованием over и разбиения по) мне нужно получить один столбец с долей стоимости автомобиля во всех автомобилях владельца (один владелец может иметь несколько автомобилей) и долю стоимости автомобиля во всех автомобилях. Я сделал что-то вроде этого

price::decimal/sum(price)OVER(PARTITION BY owners.id),

price::decimal/sum(price)OVER(PARTITION BY SUM(price))

Первый работает отлично, но я не знаю, как сделать второй. SUM не работает, потому что мы должны указать на столбец, но как получить суммарную стоимость всех автомобилей в этом случае?

У меня, например, 3 машины, каждая стоит 10 $. Есть 2 владельца A и B. A имеет 2 машины. Так что мне нужно получить

  • 1-й автомобиль А 50% (стоимость автомобилей А) 33% (стоимость всех автомобилей)
  • 2-й автомобиль А 50% (стоимость автомобилей А) 33% (стоимость всех автомобилей)
  • 1-й автомобиль B 100% (стоимость автомобилей B) 33% (стоимость всех автомобилей)

Мне просто любопытно, могу ли я сделать это без любой подзапрос, только с Partition By

1 Ответ

2 голосов
/ 04 марта 2020

Это один из способов:

select 
round((price::decimal/sum(price) over (partition by id)),4) * 100 || ' %' as share_of_owner
, round((price::decimal/sum(price) over()), 4) * 100 || ' %' as share_of_cars
from mytable
group by id, cars, price

вот демо

Я использовал round, где я округлил до 4 десятичных знаков. Вы можете изменить это в соответствии со своими потребностями.

РЕЗУЛЬТАТ:

enter image description here

...