首先,我一直在使用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") }
除了,而不是返回给定名称的第一行,应该返回具有给定名称(添加量)的所有行的mash
在mysql中,将.group(:name)
(不需要初始组)附加到select将按预期工作。
这似乎是一项日常任务,应该很容易。做这件事的简单方法是什么?请给我指一条正确的路。
第页。S.我正在努力学习这里(其他人也是),不要只是把sql扔到我脸上,请解释一下。
我不知道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()
将返回该次数乘以该金额。