|
| MS-SQL: Join's over flere tabeller Fra : Thomas Hviid Thorn |
Dato : 30-11-05 09:52 |
|
Hej ...
Jeg skal lave en join over flere tabeller.
Jeg havde forestillet mig at lave den som nedenfor:
select kunde.nr,kunde.navn,
sum(faktura.pris),sum(faktura.kostpris),
sum(bogført.pris),sum(bogført.kostpris)
from kunde join
faktura on faktura.kundenr = kunde.nr join
bogført on bogført.kundenr = kunde.nr
order by kunde.nr,kunde.navn
group by kunde.nr,kunde.navn
(Gengivet frit efter hukommelsen) Select'en giver de rigtige linier
tilbage (en pr kunde med summer), men summerne er forkerte: F.eks. er
sum(faktura.pris) ganget antallet af linier i bogført-tabellen.
Jeg har prøvet med subqueries, men da faktura og bogført er store
tabeller bliver performance for dårlig.
Index'er er ok.
Med venlig hilsen
Thomas Hviid Thorn
| |
Thomas Hviid Thorn (30-11-2005)
| Kommentar Fra : Thomas Hviid Thorn |
Dato : 30-11-05 12:21 |
|
Hej igen
Jeg har lavet nogle eksempel data, som viser mit problem.
Hvis det ikke er oplysninger nok, så giver jeg gerne noget mere
(men jeg ved ikke lige, hvad jeg ellers kan supplere med).
Jeg håber det giver en ide om, hvad jeg vil:
Kunde
Nr Navn
1 Thomas
2 Søren
3 Hanne
Faktura
KundeNr BilagNr VareNr Antal Pris KostPris
1 5 A 5 10 8
1 6 A 3 10 8
1 6 B 6 9 5
2 8 F 2 5 4
2 8 G 9 7 6
3 7 A 5 10 8
3 7 H 3 2 1
3 9 C 8 13 13
Bogført
KundeNr BilagNr VareNr Antal Pris KostPris
1 1 A 5 10 8
1 2 B 6 9 5
2 4 F 2 5 4
2 4 G 9 7 6
3 3 A 5 10 8
3 3 H 3 2 1
Ønsket output
1 Thomas 29 21 19 13
2 Søren 12 10 12 10
3 Hanne 25 22 12 9
Fået output
1 Thomas 58 42 57 39
2 Søren 24 20 24 20
3 Hanne 50 44 36 27
Som I kan se, så er f.eks. har Thomas Pris 58 (1 række/3
kolonne).
Det er
= 2 bogførte linier * Sum faktura pris (10+10+9)
=
Med venlig hilsen
Thomas Hviid Thorn
| |
Peter Lykkegaard (30-11-2005)
| Kommentar Fra : Peter Lykkegaard |
Dato : 30-11-05 12:38 |
|
Thomas Hviid Thorn wrote:
> Jeg skal lave en join over flere tabeller.
> Jeg havde forestillet mig at lave den som nedenfor:
>
> select kunde.nr,kunde.navn,
> sum(faktura.pris),sum(faktura.kostpris),
> sum(bogført.pris),sum(bogført.kostpris)
> from kunde join
> faktura on faktura.kundenr = kunde.nr join
> bogført on bogført.kundenr = kunde.nr
> order by kunde.nr,kunde.navn
> group by kunde.nr,kunde.navn
>
> (Gengivet frit efter hukommelsen) Select'en giver de rigtige linier
> tilbage (en pr kunde med summer), men summerne er forkerte: F.eks. er
> sum(faktura.pris) ganget antallet af linier i bogført-tabellen.
>
Lav en inner join mellem faktura og bogført hvor fakturaer der ikke er
bogført optræder som null værdier
Join derefter med kunde tabellen
- Peter
| |
Thomas Hviid Thorn (30-11-2005)
| Kommentar Fra : Thomas Hviid Thorn |
Dato : 30-11-05 14:13 |
|
Peter Lykkegaard <peter.aghl@gmail.com> skrev:
>Lav en inner join mellem faktura ogbogført hvor fakturaer der
> ikke er bogført optræder som null værdier
Tak for tippet! Jeg laver følgende
select Bogført.KundeNr,
sum(Bogført.Pris),sum(Bogført.Kostpris),
sum(Faktura.Pris),sum(Faktura.Kostpris)
from Bogført inner join
Faktura ON Faktura.KundeNr = Bogført.KundeNr
group by Bogført.KundeNr
Resultatet er dog stadig det samme!!
Og - noget sikkert også er et problem i mit eget select - så
kommer kunder, der kun har Faktura'er ikke med.
Hvis jeg laver en FULL JOIN, så kommer alle kunder med, der
enten har en Bogført eller Faktura - men tallene er stadig
forkerte.
Der må være noget grundlæggende forkert i den måde jeg prøver at
løse problemet på ... ?
Venlig Hilsen Thomas
| |
Thomas Hviid Thorn (30-11-2005)
| Kommentar Fra : Thomas Hviid Thorn |
Dato : 30-11-05 14:52 |
|
Hej Peter
Du fik mig alligevel på rette spor!
Jeg lavede nedenstående, som virker:
select Kunde.Nr, Kunde.Navn
Sum(FakSum.F_Pris),Sum(FakSum.F_KostPris),
Sum(FakSum.B_Pris),Sum(FakSum.B_KostPris)
from Kunde left outer join
(select Faktura.KundeNr as Nr,
Sum(Pris) AS F_Pris,Sum(KostPris) AS F_KostPris
'0' AS B_Pris,'0' AS B_KostPris
from Faktura
group by Faktura.KundeNr
UNION
select Bogført.KundeNr AS Nr,
'0' AS F_Pris,'0' AS F_KostPris
Sum(Pris) AS B_Pris,Sum(KostPris) AS B_KostPris
from Bogført
group by Bogført.KundeNr
) FakSum ON FakSum.Nr = Kunde.Nr
group by Kunde.Nr, Kunde.Navn
Tak for hjælpen /Thomas
| |
Peter Lykkegaard (30-11-2005)
| Kommentar Fra : Peter Lykkegaard |
Dato : 30-11-05 15:03 |
|
Thomas Hviid Thorn wrote:
> Peter Lykkegaard <peter.aghl@gmail.com> skrev:
> >Lav en inner join mellem faktura ogbogført hvor fakturaer der
> > ikke er bogført optræder som null værdier
>
> Tak for tippet!
Arghh - Jeg huskede forkert
Det er outer join jeg tænkte på
LEFT OUTER JOIN or LEFT JOIN
RIGHT OUTER JOIN or RIGHT JOIN
Prøv at sammenligne performance med din UNION
Kik i BOL mht outer join
- Peter
| |
|
|