@mefisto661

Как использовать вложенный JOIN при GROUP BY?

Имеется следующая таблица-
CREATE TABLE help (user_id INT, film_id INT, price INT, source VARCHAR(10));

Которая содержит следующие данные
INSERT INTO help(user_id, film_id, price, source) VALUES(1, 3,52, 'netflix'), (2, 5,100, 'amazon'), (1, 6,10, 'netflix'), (5, 2,51,'amazon');

Где user_id - ID пользователя, film_id - ID фильма, price - цена и scource - платформа, на которой смотрели фильм.
и таблица
CREATE TABLE watch (user_id INT, film_id INT, lenght INT);
INSERT INTO watch (user_id, film_id, lenght) VALUES(1, 3, 322), (2, 5, 232);

Где user_id - ID пользователя, film_id - ID фильма и length - время просмотра фильма.
Задача - найти найти сумму потраченных средств (SUM(price)) и среднее время просмотра фильма, для каждой категории

Нужно сделать в одном запросе.
Сумму можем вычислить так - SELECT SUM(price) as s FROM help GROUP BY scource;
Среднее время так
SELECT AVG(length) FROM watch w JOIN help h ON h.user_id=w.user_id and h.film_id=w.film_id GROUP BY h.source)

Но как совместить в один запрос? Как в вложенный select передать только IDшники, относящиеся к нужной категории?
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker
Программист, энтузиаст
SELECT 
  AVG(length)
  ,SUM(h.price) -- это если сумма средств конкретного пользователя, а не вообще.
  ,(SELECT SUM(price) as s FROM help WHERE source=h.source) -- а это если сумма нужна полная по категории
FROM 
  watch w 
    JOIN help h ON h.user_id=w.user_id and h.film_id=w.film_id 
GROUP BY h.source)
Ответ написан
@MaximaXXl
Извините за мой французкий, но база спроэктирована ... плохо
Куча спец слов которые надо экранировать или еще както ...
SELECT source, 
AVG(w.lenght) ag, 
sum(SUM(h.price)) over (partition by  h.source) s
  FROM help h left JOIN watch w ON h.user_id=w.user_id and h.film_id=w.film_id
group by source
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы