Avatar billede sblar Nybegynder
30. marts 2001 - 18:17 Der er 13 kommentarer og
1 løsning

GROUP BY og ORDER BY

Hej.

Hvordan får jeg udtrukket følgende data
således at de grupperes efter nummer og
inden for det enkelte nummer, sorteres efter dato?


Nummer  Dato      Text1  Text2

100        2000-02-01 432    Hallo   
100    2000-03-01 432       Hallo   
200    2000-01-01 wdfdsdf 234e     
200    2000-01-04 Hallo  Hej     
100    2000-04-01 432    Hallo   
100    2000-01-01 432    Hallo   
100    2000-01-01 432    Hallo   
234    1999-05-01 post11  hallo igen
100    1999-12-22 433    Hallo   
100    2000-05-07 432    Hallo   
100    2000-01-01 432    Hallo   
234    2000-03-15 kjhgk  hkkjh   
234    2000-01-01 kjhhj  908uj   


En simpel ORDER BY Dato giver selvfølgelig
dette resultat.

234    1999-05-01 post11  hallo igen
100    1999-12-22 433    Hallo   
100    2000-01-01 432    Hallo   
100    2000-01-01 432    Hallo   
100    2000-01-01 432    Hallo   
200    2000-01-01 wdfdsdf 234e     
234    2000-01-01 kjhhj  908uj   
200    2000-01-04 Hallo  Hej     
100    2000-02-01 432    Hallo   
100    2000-03-01 432    Hallo   
234    2000-03-15 kjhgk  hkkjh   
100    2000-04-01 432    Hallo   
100    2000-05-07 432    Hallo   


Men det jeg ønsker er dette:

234    1999-05-01 post11  hallo igen
234    2000-01-01 kjhhj  908uj   
234    2000-03-15 kjhgk  hkkjh   
100    1999-12-22 433    Hallo   
100    2000-01-01 432    Hallo   
100    2000-01-01 432    Hallo   
100    2000-01-01 432    Hallo   
100    2000-02-01 432    Hallo   
100    2000-03-01 432    Hallo   
100    2000-04-01 432    Hallo   
100    2000-05-07 432    Hallo   
200    2000-01-01 wdfdsdf 234e     
200    2000-01-04 Hallo  Hej     

Jeg troede at jeg kunne gruppere efter Nummer og til sidste sortere efter Dato, sådan her:
select Nummer, Dato, Text1,Text2 from Table1 group by  Nummer, Dato, Text1,Text2 order by dato

Men resultatet blev at grupperingen blev \"ødelagt\" af sorteringen.

Nogen idéer?

Avatar billede proaccess Nybegynder
31. marts 2001 - 09:27 #1
SELECT Nummer, Dato, Text1, Text2 FROM Table1 ORDER BY Nummer, Dato

Du behøver ikke gruppering, når du ikke laver \"sammentræk\" af data...

Hvis du vil eliminere dublerede data, burde du kunne bruge:

SELECT DISTINCT Nummer, Dato, Text1, Text2 FROM Table1

/ProAccess
Avatar billede proaccess Nybegynder
31. marts 2001 - 09:30 #2
UPS!! - Din SQL gør brug af mindste dato pr. gruppe, til sorteringen, så prøv denne:

SELECT Nummer, Dato, Text1, Text2 FROM Table1 GROUP BY Nummer, Dato, Text1, Text2 ORDER BY Min(Dato), Nummer, Dato
Avatar billede sblar Nybegynder
31. marts 2001 - 12:41 #3
Desværre proaccess, det virker heller ikke. Dir sidste forslag sorterer udelukkende på dato og det duer ikke. De enkelte gruuper må ikke splittes ad og den gruppe der indeholder den første dato, skal stå først og så fremdeles.
Jeg tror det kræver lidt kode i en stored procedure men hvilke muligheder har man i en sp behandle en post ad gangen. Hvordan løber man igennem et resultset? Skal man bruger en cursor eller kan man bruge et recordset som i ADO, eller hvad?
Avatar billede torbenkoch Nybegynder
01. april 2001 - 22:45 #4
Hmm - det kan sgu da ikke passe, at den skal være så besværlig!

Følgende:

select min(dato) as dato, nummer from eksperten group by nummer order by dato

Giver:

1999-05-01     234
1999-12-22     100
2000-01-01     200

Men hvordan kommer vi videre herfra? Er der en unik ID i tabellen, som vi kan bruge til noget??
Avatar billede proaccess Nybegynder
02. april 2001 - 09:33 #5
Problemet består i at vi skal sortere efter den mindste dato for gruppen, derefter efter dato\'er inde i hver gruppe, dette kan gøres ved at lave et ekstra opslag for hver række, men hvis tabellen er stor, så tager det altså meget længere tid... MEN PRØV DETTE:

SELECT Nummer, Dato, Text1, Text2 FROM Table1 AS T1 ORDER BY SELECT(Min(Dato) FROM Table1 WHERE Nummer=T1.Nummer), Dato

Du behøver ikke at lave gruppering, da du ikke laver sum, min, max osv.


Avatar billede torbenkoch Nybegynder
03. april 2001 - 09:01 #6
Proaccess: Ovenstående virker ikke - prøv selv at afvikle den - den kan slet ikke køre - heller ikke selvom man sætter parenteserne rigtigt...! Da ORDER BY ikke udføres for hver enkelt record, som en beregning f.eks. ville, vil denne fremgangsmåde ikke virke.

Jeg tror vi skal ud i noget med at lave en SP til det, men her har vi nok behov for at have en unik ID i tabellen. Har vi det?

Noget af det, der driller mest, synes jeg, er at man ikke kan have en unik ID med i select listen i mit ovenstående eksempel uden at gruppere på den og så er det lissom ødelagt. Nogle ideer her?
Avatar billede sblar Nybegynder
03. april 2001 - 09:18 #7
Det er ikke noget problem at oprette et unikt ID, hvilket sikkert bliver nødvendigt i en sp for at returnere posterne i den rigtige rækkefølge. Jeg forestiller mig noget med at læse en post ad gangen og afhængigt af postens indhold, midlertidigtat putte den ind i en temporær tabel med ID i rækkefølge. Til sidst, når alle poster er behandlet kan de returneres til klienten. Men, hvordan løber man gennem alle posterne fra et bestemt udtræk. Kom med et godt eksempel og få dine point.
Avatar billede proaccess Nybegynder
03. april 2001 - 09:28 #8
Jeg har problemet at jeg ikke har adgang til MS SQL, så jeg svarer ud fra generelle SQL betragtninger...

Hvis du kan leve med at få \"fjernet\" dine dubletter så burde du kunne bruge:

SELECT DISTINCT (SELECT Min(Dato) FROM Tabel1 WHERE Nummer=T1.Nummer) AS mDato, T1.Nummer, T1.Dato, T1.Text1, T1.Text2 FROM Tabel1 AS T1

Dette er testet i Access, hvor det gav den rigtige rækkefølge, dog kun med unikke rækker.
Avatar billede jakoba Nybegynder
08. april 2001 - 15:44 #9
Du skal ikke bruge en group by, men istedet en toleddet order by:

ORDER BY nummer, dato

mvh JakobA
Avatar billede jakoba Nybegynder
08. april 2001 - 15:50 #10
eller hvis du kun ønsker een linie og dato ud pr nummer:

SELECT Nummer,  min(dato) as dag,  Text1,  Text2
FROM ...

GROUP BY nummer, Text1, Text2
ORDER BY dag
Avatar billede jakoba Nybegynder
08. april 2001 - 15:54 #11
SELECT Nummer,  min(dato) as dag,  Text1,  Text2
FROM ...

GROUP BY Nummer, Text1, Text2
ORDER BY Nummer, dag
Avatar billede haunted Nybegynder
10. april 2001 - 13:55 #12
select Nummer, Dato, Text1, Text2 from Table1
Order by Nummer DESC, Dato ASC

Avatar billede sblar Nybegynder
10. april 2001 - 18:15 #13
Intet af det foreslåede virker, det er vigtigt at den gruppe som har den lavaeste dato kommer først o.s.v. Hvad orden de enkelte grupper kommer i, er ligegyldigt. Når jeg en dag får tid til at lave en SP der kan det her, poster jeg den her.
Søren
Avatar billede sblar Nybegynder
26. november 2001 - 16:32 #14
!
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