Как суммировать значения двух сопоставленных таблиц без получения дубликатов в SQL - PullRequest
1 голос
/ 09 января 2020

enter image description here

Я получил вышеупомянутый результат в Excel после фильтрации двух таблиц по (где) tableA.cost = TableB.total.

Я пытался применить то же самое в SQL, но я получил повторяющиеся значения.

Вот мой запрос SQL:

SELECT sum(total), sum(cost)
FROM TableA
INNER JOIN TableB ON tableA.ID = tableB.ClientID
WHERE tableA.ID = 45454
  AND TableA.code= 'A'
  AND TableA.period = 1
  AND TableB.status = 71
  AND TableA.SORT = 'SS'
  AND TableB.SORT= 'SS'

, и результат был

total   cost
-235.80 -47.16

Таким образом, столбец total был дублирован пять раз на основе номеров строк в столбце cost.

Можно ли как-то предотвратить дублирование всего столбца , а не ?

1 Ответ

1 голос
/ 09 января 2020

Вы можете выполнить это заданное требование c всего двумя подзапросами:

select
    (
        select sum(total)
        from tableb
        where clientID = 45454 and status = 71 and sort = 'SS'
    ) sum_total,
    (
        select sum(cost)
        from tablea
        where id = 45454 and code= 'A' and period = 1 and sort = 'ss'
    ) sum_cost

Если вам нужно обработать больше (или все) id с одновременно, то вы также можете join два совокупных подзапроса:

select a.id, b.sum_total, a.sum_cost
from (
    select clientID, sum(cost) sum_cost
    from tableb
    where status = 71 and sort = 'SS'
) b
inner join (
    select id, sum(total) sum_total
    from tablea
    where code= 'A' and period = 1 and sort = 'ss'
    group by id
) a on a.id = b.clientID
group by a.id

Если у вас всегда есть только одна запись в tablea на id, тогда запросы упрощаются:

select 
    (
        select sum(b.total)
        from tableb b
        where b.clientID = a.id and b.status = 71 and b.sort = 'SS'
    ) sum_total,
    cost
from tablea
where code= 'A' and period = 1 and sort = 'ss' -- and id = 45454 
...