Присоединение к той же таблице 2 раза, затем суммирование -> удваивает фактическое требуемое значение - PullRequest
0 голосов
/ 22 января 2019

У меня есть запрос SQL, который выглядит следующим образом:

select L.ID, P.FIRSTNAME as Firstname, P.LASTNAME as Lastname, SUM(R.VAL), SUM(R2.VAL) from LABORATORY L
join RESULT R
    on L.ID=R.ID 
    and R.RESID='Thingy1'
join PERSON P
    on P.PERID=R.PERID
    and P.LASTNAME={Lastname} <-this is part of the framework I'm working with and gets replaced, don't worry about it
    and P.FIRSTNAME={Firstname}
join RESULT R2
    on R2.PERID=P.PERID
    and R2.RESID='Thingy2'

Теперь, так как я присоединяюсь к Таблице результатов 2 раза, обе суммы в два раза больше, чем должны быть. Если я оставляю суммы, я получаю эту таблицу в результате.


123 Ману Драйер

234 Михаэль Шухмахер

423 Барак Обама

123 Ману Дрейер

234 Михаэль Шухмахер

423 Барак Обама


Извините, я не знаю, как правильно отобразить таблицу здесь: P

Как видите, каждое значение в этой таблице встречается 2 раза. Если я добавлю «отличное», то будет только 3 значения (правильное), но значение СУММЫ все еще удваивается. Любая подсказка о том, что я мог сделать с этим, была бы полезна. Со счетом я могу написать:

count(distinct L.ID)

Но это не работает с суммами, поскольку некоторые люди имеют одинаковые значения (например, возраст). Суммирование различных возрастов, чтобы получить общий возраст людей, не работает;)

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вы должны присоединиться к подзапросу на сумму

  select L.ID, P.FIRSTNAME as Firstname, P.LASTNAME as Lastname, r1.sum_1, r2.sum_2
  from LABORATORY L 
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_1
    from RESULT 
    where RESID='Thingy1'
    group by ID, PERID
  ) r1 on r1.PERID = P.PERID AND r1.ID = L.ID
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_2
    from RESULT 
    where RESID='Thingy2'
    group by ID, PERID

  ) r2 on r2.PERID = P.PERID AND r2.ID = L.ID
  INNER PERSON P ON P.PERID = r1.PERID 
0 голосов
/ 22 января 2019

Вы, кажется, имеете дело с объединением N-M. Чтобы избежать двойных вычислений SUM s, одним из решений является перемещение сводного запроса в JOIN s, например, так:

select 
    L.ID, 
    P.FIRSTNAME as Firstname, 
    P.LASTNAME as Lastname, 
    R1.sum_val, 
    R2.sum_val
from LABORATORY L
join (SELECT ID, SUM(VAL) sum_val FROM RESULT R WHERE RESID='Thingy1' GROUP BY ID) R
    on L.ID=R.ID 
join PERSON P
    on P.PERID=R.PERID
    and P.LASTNAME={Lastname}
    and P.FIRSTNAME={Firstname}
join (SELECT PERID, SUM(val) FROM RESULT WHERE R2.RESID='Thingy2' GROUP BY PERID) R2
    on R2.PERID=P.PERID

При использовании этого метода агрегация происходит внутри объединенных подзапросов и не влияет на внешний запрос.

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