将 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

步骤:

  1. 计算Atlanta

  2. 来自 Table A 的金额总和:

100 + 200

  1. 将修饰符添加到 #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.

SQLfiddle

目前还不清楚您需要什么。此外,对此类事物使用 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;

http://rextester.com/OSS97422

如果您有模型 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'。

如果您的任务不同,您可以根据需要修改这些调用。