将 table A 的 SUM 添加到 table B 的单列
Add SUM from table A to a single column of table B
简化术语:
Table A
ID | City | Amount
1 | Atlanta | 100
2 | Atlanta | 200
3 | Utah | 300
Table B
ID | City | Modifier
1 | Atlanta | 50
2 | Utah | 60
步骤:
计算Atlanta
来自 Table A 的金额总和:
100 + 200
- 将修饰符添加到 #1 的结果:
50 + ( 100 + 200 )
输出:
350
编辑:
我只能得到TableA的金额总和,我不知道如何添加修饰符而不添加它到TableA的每条记录:
TableA.joins("
LEFT JOIN TableB ON TableB.city = TableA.city
").select("
SUM(TableA.amount) + TableB.modifier
").where("
TableA.city = 'Atlanta'
").group("
TableA.city
")
使用原始 SQL:
可以很容易地回答这个问题
with amount_by_city as (
select
city
, sum(amount) as total_amount
from table_a
group by city
)
select
b.city
, a.total_amount + b.modifier
from table_b b
join amount_by_city a on b.city = a.city
RoR 可以 运行 原始 SQL 语句,如 Rails raw SQL example 中所述。除非你有其他需求,否则直接使用原始 SQL.
目前还不清楚您需要什么。此外,对此类事物使用 Arel 方法链会使它们变得更加复杂。
如果你想要一个城市列表,其中包含表 A 中的金额总和加上表 B 中的修饰符,则可以通过单个 SQL-查询获得。
(假设您使用的是 PostgreSQL):
SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS modified_sum
FROM (SELECT city, SUM(amount) AS amount FROM table_a GROUP BY city) T
FULL JOIN table_b B ON B.city = T.city;
如果您有模型 TableA 和 TableB,则查询可以转换为 Rails 方法:
TableA.find_by_sql "SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS amount
FROM (SELECT city, SUM(amount) AS amount FROM #{TableA.table_name} GROUP BY city) T
FULL JOIN #{TableB.table_name} B ON B.city = T.city"
如果您的任务是获取 'Atlanta' 的值,那么方法调用将是:
TableA.find_by_sql ["SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS amount
FROM (SELECT city, SUM(amount) AS amount FROM #{TableA.table_name} GROUP BY city) T
LEFT JOIN #{TableB.table_name} B ON B.city = T.city
WHERE T.city = :city", { city: 'Atlanta' }]
请注意第一种情况是FULL JOIN
,第二种情况是LEFT JOIN
。对于第一次查询,FULL JOIN
提供了两个表 A 和 B 中的城市。对于第二次调用,查询在表 A 中查找 'Atlanta'。
如果您的任务不同,您可以根据需要修改这些调用。
简化术语:
Table A
ID | City | Amount
1 | Atlanta | 100
2 | Atlanta | 200
3 | Utah | 300
Table B
ID | City | Modifier
1 | Atlanta | 50
2 | Utah | 60
步骤:
计算
Atlanta
来自 Table A 的金额总和:
100 + 200
- 将修饰符添加到 #1 的结果:
50 + ( 100 + 200 )
输出:
350
编辑:
我只能得到TableA的金额总和,我不知道如何添加修饰符而不添加它到TableA的每条记录:
TableA.joins("
LEFT JOIN TableB ON TableB.city = TableA.city
").select("
SUM(TableA.amount) + TableB.modifier
").where("
TableA.city = 'Atlanta'
").group("
TableA.city
")
使用原始 SQL:
可以很容易地回答这个问题with amount_by_city as (
select
city
, sum(amount) as total_amount
from table_a
group by city
)
select
b.city
, a.total_amount + b.modifier
from table_b b
join amount_by_city a on b.city = a.city
RoR 可以 运行 原始 SQL 语句,如 Rails raw SQL example 中所述。除非你有其他需求,否则直接使用原始 SQL.
目前还不清楚您需要什么。此外,对此类事物使用 Arel 方法链会使它们变得更加复杂。
如果你想要一个城市列表,其中包含表 A 中的金额总和加上表 B 中的修饰符,则可以通过单个 SQL-查询获得。
(假设您使用的是 PostgreSQL):
SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS modified_sum
FROM (SELECT city, SUM(amount) AS amount FROM table_a GROUP BY city) T
FULL JOIN table_b B ON B.city = T.city;
如果您有模型 TableA 和 TableB,则查询可以转换为 Rails 方法:
TableA.find_by_sql "SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS amount
FROM (SELECT city, SUM(amount) AS amount FROM #{TableA.table_name} GROUP BY city) T
FULL JOIN #{TableB.table_name} B ON B.city = T.city"
如果您的任务是获取 'Atlanta' 的值,那么方法调用将是:
TableA.find_by_sql ["SELECT T.city, COALESCE(T.amount, 0) + COALESCE(B.modifier, 0) AS amount
FROM (SELECT city, SUM(amount) AS amount FROM #{TableA.table_name} GROUP BY city) T
LEFT JOIN #{TableB.table_name} B ON B.city = T.city
WHERE T.city = :city", { city: 'Atlanta' }]
请注意第一种情况是FULL JOIN
,第二种情况是LEFT JOIN
。对于第一次查询,FULL JOIN
提供了两个表 A 和 B 中的城市。对于第二次调用,查询在表 A 中查找 'Atlanta'。
如果您的任务不同,您可以根据需要修改这些调用。