首先,我一直在使用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
我找到的最近的是Merge duplicate records into 1 records with the same table and table fields
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") }
除了返回给定名称的第一行,而不是返回具有给定名称的所有行的mash(添加的数量)
在mysql中,将.group(:name)
(不需要初始组)附加到select将按预期工作。
这似乎是一项日常工作,应该很容易。这样做的简单方法是什么?请指出正确的道路。
P.S。我想在这里学习(其他人也是这样),不要只是扔掉我的脸,请解释一下。
答案 0 :(得分:1)
我不知道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(*)
将返回每个金额出现在每个名称的次数,以及{{ 1}}将返回该数量乘以该数量。