Sumowanie w relacji jeden do wielu z wielu tabel

Odpowiedz Nowy wątek
2015-08-06 19:13
0

f800de2c9e.pngCześć. Załóżmy, że mam tabelę T1, która posiada relacje jeden do wielu z tabelami T2 i T3 . Chciałbym wypisać np. nazwę z T1, sumę liczb z T2, sumę liczb z T3. Oczywiście pogrupowane, że sumuje mi liczby dla odpowiedniej nazwy. Schemat tabel, dane w tabelach i interesujące mnie wyniki są poniżej.

Zrobiłem coś takiego:

SELECT T1.Nazwa,
(SELECT SUM(Liczba) FROM T2 WHERE T2.Id = T1.Id),
(SELECT SUM(Liczba) FROM T3 WHERE T3.Id = T1.Id)
FROM  T1

Jednak czy istnieje jakieś lepsze i wydajniejsze rozwiązanie? Próbowałem robić to z GROUP BY jednak wyniki miałem złe.

Tabele:
f1817033b6.png

Dane i wyniki:
65150654cb.png31457ca006.png

edytowany 2x, ostatnio: Degusto, 2015-08-06 21:58
Tabela nie posiada relacji. Tabela jest relacją. - somekind 2015-08-06 21:28

Pozostało 580 znaków

2015-08-06 19:45
1
select
  t1.nazwa,
  sum(t2.liczba) liczba2,
  sum(t3.liczba) liczba3,
from
  t1
left join t2 on t2.id = t1.id2
left join t3 on t3.id = t1.id3
group by
  t1.nazwa

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2015-08-06 20:03
0

Niestety wyniki jakie mam dla tego zapytania to:

Test     5       150
Test2   NULL    500
Test3   NULL    NULL

Pozostało 580 znaków

2015-08-06 20:24
0
SELECT
  t1.nazwa,
  SUM(ISNULL(t2.liczba, 0)) liczba2,
  SUM(ISNULL(t3.liczba, 0)) liczba3,
FROM
  t1
LEFT JOIN t2 ON t2.id = t1.id2
LEFT JOIN t3 ON t3.id = t1.id3
GROUP BY
  t1.nazwa

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2015-08-06 20:33
0

Teraz jest:

Test     25   250
Test2   30    800
Test3   NULL    NULL

W ogóle T1.Id2 i T1.Id3 nie jest przypadkiem pomyłką?

Pozostało 580 znaków

2015-08-06 21:24
0
  1. obrazki wrzucaj do postu a nie jako spakowany załącznik!
  2. masz kijowo (żeby nie napisać dosadniej) nazwane kolumny. Id to ma być PK a nie FK!
  3. wg Twojego schematu to będzie
    SELECT
    t1.nazwa,
    SUM(ISNULL(t2.liczba, 0)) liczba2,
    SUM(ISNULL(t3.liczba, 0)) liczba3,
    FROM
    t1
    LEFT JOIN t2 ON t2.id = t1.id
    LEFT JOIN t3 ON t3.id = t1.id
    GROUP BY
    t1.nazwa

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Masz zdrowie :) - woolfik 2015-08-11 08:47

Pozostało 580 znaków

2015-08-06 22:04
0
  1. Poprawione
  2. Nazwy takie bo pisałem to tylko do testu
  3. Teraz wyniki są takie:
    Test     90    750
    Test2   60  1600
    Test3   0    0

Jeśli zrobimy tak:

SELECT T1.Nazwa,
SUM(DISTINCT T2.Liczba),
SUM(DISTINCT T3.Liczba)
FROM T1
LEFT JOIN T2 ON T2.Id=T1.Id
LEFT JOIN T3 ON T3.Id=T1.Id
GROUP BY
T1.Nazwa

To wtedy zwraca poprawne wyniki, ale tylko jeśli w tabeli nie istnieją dwa takie same wpisy.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0