#sql #postgresql
#sql #postgresql
Вопрос:
учитывая таблицу счетов
# bills
id | name | amount | user_id
1 | jumper | 100 | 1
2 | gopper | 200 | 1
3 | jumper | 150 | 2
4 | blobber | 300 | 3
и таблица users
# users
id | name
1 | John Doe
2 | Mike Marley
3 | Bill Mickane
когда я выполняю запрос
select * from bills where user_id in (1,2) order by name, amount desc
Я получаю
# bills
id | name | amount | user_id
2 | gopper | 200 | 1
3 | jumper | 150 | 2
1 | jumper | 100 | 1
но то, что я хочу, это (и все остальные столбцы)
# bills
name | amount
gopper | 200
jumper | 250
как это будет достигнуто?
У меня возникает соблазн использовать
select * from bills where user_id in (1,2) group by name order by name, amount desc
но не может, так как group by
также потребуется перечислить имена других столбцов и в конечном итоге не объединить две строки по желанию.
p.s. Я использую postgresql
Ответ №1:
Если вам нужны только эти 2 поля, вы можете использовать Aggregate SUM():
SELECT
name,
SUM(amount)
FROM
bills
WHERE
user_id IN (1,2)
GROUP BY
name
ORDER BY
name,
amount
Однако предположим, что вы хотели больше, чем просто эти два поля…
вложенные запросы должны вам помочь.
SELECT
m.id, m.name, t.userId, t.amount
FROM Bills m
INNER JOIN
(
SELECT
user_id as userID,
SUM(amount) as amount
FROM
bills
GROUP BY user_id
) t
ON t.UserID = m.UserID
Комментарии:
1. Спасибо за ваш ответ.
PGError: ERROR: column t.userID does not exist
, когда я меняю начальный выбор наselect * from bills m...
, результаты не группируются по имени, даже изменение внутреннего объединения на group by name вместо user_id не работает должным образом (все счета, гдеuser_id in (1,2)
сгруппированы по имени). Есть мысли?
Ответ №2:
SELECT
name, SUM(amount)
FROM
bills
WHERE
user_id IN (1,2)
GROUP BY
name
ORDER BY
name, amount DESC
Ответ №3:
SELECT name, SUM(amount) as amount
FROM bills where user_id IN (1,2)
GROUP BY name
ORDER BY name, amount DESC
Ответ №4:
select name, sum(amount) as amount
from bills where user_id in (1,2)
group by name
order by name, amount desc