ruby-on-rails - 将表 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
脚步:
计算
Atlanta
表 A 中的金额总和:
100 + 200
- 将修饰符添加到 #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
")
解决方案
目前还不清楚你需要什么。此外,对此类事情使用 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;
如果您有模型 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 中查找“亚特兰大”。
如果您的任务不同,您可以根据需要修改这些调用。
推荐阅读
- jquery - 如何使用jQuery从下拉列表中获取所选值的ID
- c++ - 如何使用 std::chrono 库设置特定时间?
- json - 使用 Guzzle Laravel 访问嵌套的 Json 响应
- c# - Unity 中的类继承
- ios - 在 Swift 中返回相同的函数本身有什么用
- android - 使用graphview库的Android实时信号不流畅
- javascript - net::ERR_ABORTED 500 当使用 fetch POST to web
- python - 具有“任意”值的 QSlider(来自列表/数组)?
- mysql - mariadb 已报告“end if”错误
- javascript - 为javascript的vscode扩展编写完成提供程序的最佳方法是什么