Postgresql (Rails 3) объединяет строки в столбце (та же таблица) - PullRequest
1 голос
/ 31 мая 2011

Во-первых, я использовал mysql навсегда и теперь обновляюсь до postgresql.Синтаксис sql намного более строгий, а некоторые поведение отличается, поэтому мой вопрос.

Я искал, как объединить строки в запросе postgresql к таблице, такой как

id      | name        |   amount
0       | foo         | 12
1       | bar         | 10
2       | bar         | 13
3       | foo         | 20

и получить

name        |   amount
foo         | 32
bar         | 23

Самое близкое, что я нашел, это Объединить дублирующиеся записи в 1 запись с одинаковыми полями таблицы и таблицы

sql, возвращая дубликаты 'name':

 scope :tallied, lambda { group(:name, :amount).select("charges.name AS name,
                              SUM(charges.amount) AS amount,
                              COUNT(*) AS tally").order("name, amount desc") }

Что мне нужно, это

 scope :tallied, lambda { group(:name, :amount).select("DISTINCT ON(charges.name) charges.name AS name,
                              SUM(charges.amount) AS amount,
                              COUNT(*) AS tally").order("name, amount desc") }

за исключением того, что вместо того, чтобы возвращать первую строку данного имени, следует возвращать месив всех строк с данным именем (сумма добавлена)

В mysql добавление.group(:name) (не требующий начальной группы) для выбора будет работать как ожидалось.

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

PS Я пытаюсь учиться здесь (как и другие), не просто бросайте sql мне в лицо, пожалуйста, объясните это.

1 Ответ

1 голос
/ 31 мая 2011

Я понятия не имею, что делает RoR в фоновом режиме, но я предполагаю, что group(:name, :amount) выполнит запрос, который группирует по имени, количеству. То, что вы ищете, это group by name:

select name, sum(amount) as amount, count(*) as tally
from charges
group by name

Если вы добавите amount к предложению group by, запрос выполнит именно это - то есть count(*) вернет количество раз, которое каждая сумма появляется на имя, а sum() вернет это число раз эта сумма.

...