Сумма, необходимая для базы данных MySQL

0

Надеюсь, вы можете помочь мне со следующим запросом:
У меня есть следующие 2 таблицы:

Изображение 174551

Изображение 174551

tableA.currencyA всегда будет = в валюте B в соответствующем элементе в таблицеB.
Мне нужно вернуть следующие результаты:

Изображение 174551

В основном в результатах мне нужно вернуть все элементы в таблице A + сводку записей в таблицеB. Я пробовал несколько запросов, но похоже, что я не могу вынести предложения для этого. Те, которые я пытался, не возвращали данные для item4 (обратите внимание, что item4 не имеет записей в таблицеB).

Теги:
database
join
outer-join
relational-database

2 ответа

1
Лучший ответ

Немного чистый подход к тому, что вам нужно

SELECT z.*,
(z.totalA - z.in) AS difference
FROM (
    SELECT a.idA, a.currencyA, a.totalA,
    IF(b.idB IS NOT NULL, SUM(b.amountA), 0) AS 'in'
    FROM tableA a
    LEFT JOIN tableB b ON a.idA = b.idA
    GROUP BY a.idA
) z;

Выход

idA currencyA   totalA  in  difference
1      usd       1000   550   450
2      usd       2000   700   1300
3      eur       3000   600   2400
4      usd       4000    0    4000

Рабочая демонстрация

  • 0
    Спасибо Самир! Отправленный вами запрос прекрасно работает. Знаете ли вы, есть ли разница в производительности между вашим запросом и тем, который я разместил ниже? stackoverflow.com/a/49157229/1835537
  • 1
    В вашем запросе он вычислит SUM и дважды проверит условие «IF / ELSE», которое не является узким местом в производительности, но может быть упрощено и немного более оптимизировано с тем, что я опубликовал.
Показать ещё 1 комментарий
0

Я считаю, что что-то вроде этого будет работать нормально:

select 
    tableA.idA, 
    tableA.currencyA as currency, 
    tableA.totalA as total, 
    case when (sum(tableB.amountB) is null) then 0 else sum(tableB.amountB) end as 'in',
    case when (sum(tableB.amountB) is null) then tableA.totalA else 
    tableA.totalA-sum(tableB.amountB) end as 'difference'
from 
    tableA left outer join tableB on tableA.idA=tableB.idA
group by tableA.idA;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню