Как избежать дубликатов в левой таблице, где первичный ключ не является уникальным в объединенной таблице - PullRequest
1 голос
/ 15 апреля 2019

У меня возникают проблемы с суммой при объединении двух таблиц, из-за чего первичный ключ уникален в левой таблице, но может дублироваться в правой таблице.Сценарий, который у меня есть, состоит в том, что case_id может иметь, например, выплату в £ 100 в левой таблице, которая затем разбивается на более низком уровне до 2 £ 50 платежей в правой таблице.Это приводит к тому, что платеж левой таблицы учитывается дважды при объединении, поскольку case_id дважды присутствует в правой таблице.

Я пробовал несколько различных вариантов запроса, но до сих пор безуспешно.Я также искал этот веб-сайт, но не смог найти сценарий, который подходит мне.

select distinct
    t1.[r_code],
    t1.[parent_case_id],
    sum(t1.[total_redress_value]),
    sum(t2.[payment_amount])
from
    [SomeTable1] t1
left join
    [SomeTable2] t2 on t1.[case_id] = t2.[case_id]
group by 
    t1.[r_code], t1.[parent_case_id]

Ожидается, что сумма total_redress_value & payment_amount будет равна 100 каждый, однако я нахожу, что сумма SUM total_redress_value равна 200 из-задублированная строка case_id из объединения.Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Сгруппируйте свой правый стол по ПК слева.

SELECT DISTINCT
       t1.[r_code],
       t1.[parent_case_id],
       SUM(t1.[total_redress_value]),
       SUM(t2.[payment_amount])
FROM [SomeTable1] t1
    LEFT JOIN
    (
        SELECT case_id,
               MIN(payment_amount) AS payment_amount --or sum etc - whatever fits your logic
        FROM [SomeTable2]
        GROUP BY case_id
    ) AS t2
        ON t1.[case_id] = t2.[case_id]
GROUP BY t1.[r_code],
         t1.[parent_case_id];
0 голосов
/ 15 апреля 2019

К сожалению, этот тип иерархического расчета немного сложен. Вы можете предварительно агрегировать t2 до join ing:

select t1.[r_code], t1.[parent_case_id],
       sum(t1.[total_redress_value]),
       sum(t2.[payment_amount])
from [SomeTable1] as t1 left join
     (select t2.case_id, sum(t2.payment_amount) as payment_amount
      from [SomeTable2] as t2
      group by t2.case_id
     ) as t2
     on t1.[case_id] = t2.[case_id]
group by t1.[r_code], t1.[parent_case_id]

Обратите внимание, что select distinct почти никогда не требуется с group by. И это, конечно, не нужно в этом случае.

...