Надеюсь, вы можете помочь мне со следующим запросом:
У меня есть следующие 2 таблицы:
tableA.currencyA всегда будет = в валюте B в соответствующем элементе в таблицеB.
Мне нужно вернуть следующие результаты:
В основном в результатах мне нужно вернуть все элементы в таблице A + сводку записей в таблицеB. Я пробовал несколько запросов, но похоже, что я не могу вынести предложения для этого. Те, которые я пытался, не возвращали данные для item4 (обратите внимание, что item4 не имеет записей в таблицеB).
Немного чистый подход к тому, что вам нужно
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
SUM
и дважды проверит условие «IF / ELSE», которое не является узким местом в производительности, но может быть упрощено и немного более оптимизировано с тем, что я опубликовал.
Я считаю, что что-то вроде этого будет работать нормально:
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;