/ / Mysql łączyć i suma podwaja wynik - mysql, sql, łączyć, grupować, funkcje agregujące

Łączenie Mysql i suma to wynik podwójny - mysql, sql, join, group-by, aggregate-functions

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 № 1

Podwaja 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 |

próbny


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.