/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste