1

首先,我一直在使用 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") }

除了返回给定名称的第一行之外,应该返回具有给定名称的所有行的混搭(添加的数量)

在 mysql 中,将.group(:name)(不需要初始组)附加到 select 将按预期工作。

这似乎是一项日常任务,应该很容易。这样做的简单方法是什么?请指出我正确的道路。

PS我在这里尝试学习(其他人也是),不要只是将sql扔在我的脸上,请解释一下。

4

1 回答 1

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(*)即将返回每个名称出现的每个数量的次数,并且sum()将返回该数量乘以该数量。

于 2011-05-31T09:35:21.750 回答