首页 > 解决方案 > 将表 A 中的 SUM 添加到表 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. 表 A 中的金额总和:

100 + 200

  1. 将修饰符添加到 #1 的结果:

50 + ( 100 + 200 )

输出:

350

编辑:

我只能得到表A的金额总和。我不知道如何添加修饰符而不将其添加到表A的每条记录中:

TableA.joins("
  LEFT JOIN TableB ON TableB.city = TableA.city
").select("
  SUM(TableA.amount) + TableB.modifier
").where("
  TableA.city = 'Atlanta'
").group("
  TableA.city
")

标签: ruby-on-railssqliteruby-on-rails-4

解决方案


目前还不清楚你需要什么。此外,对此类事情使用 Arel 方法链会使它们更加复杂。

如果您想要一个城市列表,其中包含来自 TableA 的金额总和加上来自 TableB 的修饰符,那么可以使用单个 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"

如果您的任务是获得“亚特兰大”的价值,那么方法调用将是:

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 中查找“亚特兰大”。

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


推荐阅读