SQL выбирает из таблицы, где ключ в массиве группируется по столбцам

#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