Mam tabelę przychodów jako
title_id revenue cost
1 10 5
2 10 5
3 10 5
4 10 5
1 20 6
2 20 6
3 20 6
4 20 6
kiedy wykonuję to zapytanie
SELECT SUM(revenue),SUM(cost)
FROM revenue
GROUP BY revenue.title_id
daje wynik
title_id revenue cost
1 30 11
2 30 11
3 30 11
4 30 11
co jest ok, teraz chcę połączyć wynik sumy z inną tabelą o takiej strukturze
title_id interest
1 10
2 10
3 10
4 10
1 20
2 20
3 20
4 20
kiedy wykonuję łączyć z taką funkcją agregującą
SELECT SUM(revenue),SUM(cost),SUM(interest)
FROM revenue
LEFT JOIN fund ON revenue.title_id = fund.title_id
GROUP BY revenue.title_id,fund.title_id
podwaja wynik
title_id revenue cost interest
1 60 22 60
2 60 22 60
3 60 22 60
4 60 22 60
Nie rozumiem, dlaczego to podwaja, proszę o pomoc
Odpowiedzi:
12 dla odpowiedzi № 1Podwaja się, ponieważ masz powtórzony tytułtabele funduszy i dochodów. To zwielokrotnia liczbę rekordów, do których pasuje. Łatwo jest sprawdzić, czy usuniesz funkcje agregujące i spojrzysz na surowe dane. Spójrz tutaj
Sposób obejścia tego problemu polega na utworzeniu wbudowanych widoków agregatów i dołączeniu się do tych wyników.
SELECT R.title_id,
R.revenue,
R.cost,
F.interest
FROM (SELECT title_id,
Sum(revenue) revenue,
Sum(cost) cost
FROM revenue
GROUP BY revenue.title_id) r
LEFT JOIN (SELECT title_id,
Sum(interest) interest
FROM fund
GROUP BY title_id) f
ON r.title_id = F.title_id
wydajność
| TITLE_ID | REVENUE | COST | INTEREST |
----------------------------------------
| 1 | 30 | 11 | 30 |
| 2 | 30 | 11 | 30 |
| 3 | 30 | 11 | 30 |
| 4 | 30 | 11 | 30 |
3 dla odpowiedzi № 2
Powodem tego jest to, że masz Dołączył tabela pierwsza tabela pochodna z drugiej tabeli bez grupowania. Aby rozwiązać problem, zgrupuj drugą tabelę (fund
) i połącz ją z pierwszą tabelą pochodną, używając LEWEGO DOŁĄCZENIA.
SELECT b.title_id,
b.TotalRevenue,
b.TotalCost,
d.TotalInterest
FROM
(
SELECT a.title_id,
SUM(a.revenue) TotalRevenue,
SUM(a.cost) TotalCost
FROM revenue a
GROUP BY a.title_id
) b LEFT JOIN
(
SELECT c.title_id,
SUM(a.interest) TotalInterest
FROM fund c
GROUP BY c.title_id
) d ON b.title_id = d.title_id
1 dla odpowiedzi nr 3
Istnieją dwa wiersze dla każdego tytułu_id w tabeli przychodów.