Добавить сумму из таблицы A в один столбец таблицы B - PullRequest
0 голосов
/ 02 октября 2018

Упрощенные условия:

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:

50 + (100 + 200)

Вывод:

350

edit:

Я могу получить только сумму суммы таблицы A. Я не знаю, как добавить модификатор, не добавив его вкаждая запись таблицы А:

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

До сих пор не ясно, что вам нужно.Более того, использование цепочки методов Ареля для таких вещей делает их более сложными.

Если вы хотите получить список городов с суммой сумм из таблицы A плюс модификатор из таблицы B, то его можно получить с помощью одного SQL-query.

(при условии, что вы используете 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 в последнем.Для 1-го запроса FULL JOIN предоставляет города из обеих таблиц A и B. Для 2-го вызова запрос ищет 'Atlanta' в таблице A.

Если ваша задача отличается, вы можете изменить эти вызовы по мере необходимости.

0 голосов
/ 02 октября 2018

На вопрос можно ответить довольно просто, используя необработанный 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 .Если у вас нет других потребностей, просто используйте исходный SQL.

SQLfiddle

...