Avatar billede htx98i17 Professor
12. december 2006 - 15:55 Der er 19 kommentarer og
1 løsning

group by hvilket felt?

Jeg er ved at lave en liste over kunder sorteret efter hvor mange penge de har købt for. (for at finde ud af hvem der skal have julegave :-)

Men beløbene er alt for høje. Og jeg tænker at det er grupperingen den er galt med?

SELECT
   
    tk.id,
    tk.firma,
    tk.fornavn,
    tk.efternavn,
    SUM(tol.antal*tol.pris) AS materialer,
    SUM(tt.timer*tt.timepris) AS timer
   
    FROM
       
        tblkunder AS tk,
        tblorders AS tod,
        tblorderlines AS tol,
        tbltimer AS tt
       
    WHERE
        tk.id = tod.kundeid
        AND tod.id = tol.ordreid
        AND tod.id = tt.ordreid
       
    GROUP BY
        tod.kundeid
       
    ORDER BY
        tk.id,
        materialer DESC
Avatar billede htx98i17 Professor
12. december 2006 - 16:20 #1
kan det passe problemet er at jeg vil finde frem til 2 summer i samme sql?
Avatar billede coderdk Praktikant
12. december 2006 - 16:54 #2
Hvordan ser udtrækket ud? Og hvad er de faktiske tal?
Umiddelbart synes jeg at det ser ok ud... Jeg ville skrive det på en lidt anden måde:

SELECT
    tk.id
    ,tk.firma
    ,tk.fornavn
    ,tk.efternavn
    ,SUM(tol.antal*tol.pris) AS materialer
    ,SUM(tt.timer*tt.timepris) AS timer
FROM
    tblkunder AS tk
INNER JOIN
    tblorders AS tod
ON
    tk.id = tod.kundeid
INNER JOIN
    tblorderlines AS tol
ON
    tod.id = tol.ordreid
INNER JOIN
    tbltimer AS tt
ON
    tod.id = tt.ordreid
GROUP BY
    tk.id
ORDER BY
    tk.id
    ,materialer DESC
Avatar billede coderdk Praktikant
12. december 2006 - 16:55 #3
Faktisk ville jeg lave

ORDER BY
    tk.id
    ,materialer DESC

om til:

ORDER BY
    materialer DESC

Så burde den i hvert tilfælde sortere korrekt ;)
Avatar billede htx98i17 Professor
12. december 2006 - 17:45 #4
Summene kom op i millionstørrelsen for både timer og materialer.
Kan du forklare kort hvad forskellen er på LEFT og INNER join?
Avatar billede htx98i17 Professor
12. december 2006 - 17:52 #5
Eksempel på udtræk:
1, Firmanavn, fornavn, 230807.37, 993460
2, Firmanavn, fornavn, 465837.12, 887695

Der er ingen kundeid'er der går igen
Avatar billede htx98i17 Professor
12. december 2006 - 17:56 #6
Jeg mener at have haft samme problem for nogle år siden. Problemet var der at det var fordi at jeg ville lave 2 summer i samme sql. Det kunne relationerne ikke finde ud af, derfor gik de ind og gangede med hinanden på kryds og tværs.
Avatar billede coderdk Praktikant
12. december 2006 - 17:59 #7
Hvordan er det meningen udtrækket skal se ud for ovenstående? (Prøve at se om der er en sammenhæng... Er det dobbelt? Eller andet)
Avatar billede coderdk Praktikant
12. december 2006 - 18:00 #8
Der er en fin lille artikel om JOINs her: http://en.wikipedia.org/wiki/JOIN
INNER er bare en anden måde for hvad du gjorde (jeg synes JOIN-syntaksen er pænere)
Avatar billede htx98i17 Professor
12. december 2006 - 18:02 #9
Der er ikke nogen sammenhæng at se altså om det er dobbelt, ganget, lagt sammen etc. Tallene er bare alt for høje.
Avatar billede coderdk Praktikant
12. december 2006 - 18:09 #10
Det burde være nemt at debugge, prøv at se hvad denne query giver dig:

SELECT
    tk.id
    ,tk.firma
    ,tk.fornavn
    ,tk.efternavn
    ,tol.antal
    ,tol.pris
    ,tt.timer
    ,tt.timepris
FROM
    tblkunder AS tk
INNER JOIN
    tblorders AS tod
ON
    tk.id = tod.kundeid
INNER JOIN
    tblorderlines AS tol
ON
    tod.id = tol.ordreid
INNER JOIN
    tbltimer AS tt
ON
    tod.id = tt.ordreid
ORDER BY
    tk.id
Avatar billede htx98i17 Professor
12. december 2006 - 18:16 #11
Det giver 33337 poster og ser således ud:
1 Vand og Teknik Att. Kurt 2 0.00 5 0
1 Vand og Teknik Att. Kurt 2 0.00 5 0
1 Vand og Teknik Att. Kurt 2 0.00 5 0
1 Vand og Teknik Att. Kurt 1 0.00 5 0
1 Vand og Teknik Att. Kurt 2 0.00 5 0
osv
osv
og det kan godt passe der er nogle produkter der ikke er taget penge for
Avatar billede coderdk Praktikant
12. december 2006 - 19:43 #12
Men ser det korrekt ud?
Avatar billede htx98i17 Professor
12. december 2006 - 22:29 #13
ja det synes jeg
jeg er overbevist om at det er relationerne der skrudre mudre når der skal summeres 2 gange i samme sql. Men jeg har bare aldrig kunne gennemskue det selv.
Avatar billede coderdk Praktikant
12. december 2006 - 22:38 #14
Hmm!!! Prøv lige:

SELECT
    tk.id
    ,tk.firma
    ,tk.fornavn
    ,tk.efternavn
    ,SUM(tol.antal)*tol.pris AS materialer
    ,SUM(tt.timer)*tt.timepris AS timer
FROM
    tblkunder AS tk
INNER JOIN
    tblorders AS tod
ON
    tk.id = tod.kundeid
INNER JOIN
    tblorderlines AS tol
ON
    tod.id = tol.ordreid
INNER JOIN
    tbltimer AS tt
ON
    tod.id = tt.ordreid
GROUP BY
    tk.id
ORDER BY
    materialer DESC
Avatar billede htx98i17 Professor
12. december 2006 - 22:44 #15
Det giver lige så skyhøje tal :(
Den ganger jo også summen af alle antal varer med en eller anden pris? eller hvad var meningen den skulle gøre?
Avatar billede htx98i17 Professor
12. december 2006 - 22:45 #16
Hvis du har tid kunne du måske oprette samme tabeller som mig?
jeg vil godt lave sql'en med nogle data til dig hvis det er
Avatar billede coderdk Praktikant
12. december 2006 - 22:49 #17
Aha! Prøv først:

SELECT
    tk.id
    ,tk.firma
    ,tk.fornavn
    ,tk.efternavn
    ,SUM(tol.antal*tol.pris) AS materialer
    ,SUM(tt.timer*tt.timepris) AS timer
FROM
    tblkunder AS tk
INNER JOIN
    tblorders AS tod
ON
    tk.id = tod.kundeid
INNER JOIN
    tblorderlines AS tol
ON
    tod.id = tol.ordreid
INNER JOIN
    tbltimer AS tt
ON
    tod.id = tt.ordreid
GROUP BY
    tk.id
    ,tol.orderid
ORDER BY
    materialer DESC

hvis ikke det virker, så prøv:

SELECT
    tk.id
    ,tk.firma
    ,tk.fornavn
    ,tk.efternavn
    ,SUM(tol.antal*tol.pris) AS materialer
    ,SUM(tt.timer*tt.timepris) AS timer
FROM
    tblkunder AS tk
INNER JOIN
    tblorders AS tod
ON
    tk.id = tod.kundeid
INNER JOIN
    tblorderlines AS tol
ON
    tod.id = tol.ordreid
INNER JOIN
    tbltimer AS tt
ON
    tod.id = tt.ordreid
GROUP BY
    tk.id
    ,tol.orderid
    ,tt.orderid
ORDER BY
    materialer DESC
Avatar billede coderdk Praktikant
12. december 2006 - 22:51 #18
Jeg tror bare det er et spørgsmål om at føje de korrekte felter til GROUP BY...
Avatar billede htx98i17 Professor
12. december 2006 - 22:56 #19
Den første virker ikke da den finder samme kunde flere gange med høje tal:(
Den anden finder også samme kunde flere gange med svimlende høje tal :(
Jeg har også forsøgt med flere forskellige kombinationer af group uden held
Avatar billede htx98i17 Professor
17. december 2006 - 14:47 #20
coder -> mange tak for dit forsøg på at løse det. Desværre måtte jeg lave 2 seperate udtræk...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester