Avatar billede binderup Nybegynder
19. februar 2004 - 10:15 Der er 20 kommentarer og
1 løsning

Tilpasset rækkefølge rækkefølge ved en "GROUP BY"

Jeg har en produktnyheds side hvor jeg outputter nyheder grupperet efter hvilken type produkter de tilhøre.

Jeg er så blevet bedt om at jeg skal ændre rækkefølgen som disse bliver outputtet i.

Lad os sige at produkttyper kan være: Fun Stuff, Type A, Type B, Type C

Er det muligt via SQL at ændre på rækkefølgen så nyhederne bliver grupperet i denne rækkefølge: Type A, Type B, Type C, Fun Stuff

Da det er vigtigt at jeg får vist Type A, Type B og Type C først
Avatar billede trer Nybegynder
19. februar 2004 - 10:17 #1
Du skal tilføje en ORDER BY på type-kolonne.
Avatar billede binderup Nybegynder
19. februar 2004 - 10:19 #2
jamen bliver det så ikke bare alfabetisk det bliver sorteret efter? og så vil Funn stuff da stadig komme først?
Avatar billede arne_v Ekspert
19. februar 2004 - 10:19 #3
Du laver en lille tabel med:

Type A      1
Type B      2
Type C      3
Fun stuff    4

så joiner du på den tabel også og laver ORDER BY på tal feltet.
Avatar billede trer Nybegynder
19. februar 2004 - 10:21 #4
Beklager, havde ikke fået læst spm ordenligt. Arnes løsning giver en fin metode til dit sorteringsbehov.
Avatar billede binderup Nybegynder
19. februar 2004 - 10:25 #5
Ja jeg havde frygtet at det var den eneste løsning. Problemet er blot at jeg skal oprette tabellen gennem et besværligt Q&A forløb så jeg havde håbet på at man kunne lave en parameter på en order by evt i stilen

ORDER BY TYPE (WHERE TYPE='Type A' OSV.)

Problemet er at det kun er typerne A, B, C der skal vises først resten skal vises i alfabetisk række følge og kategorierne vil med tiden ændre sig så vi havde håbet på at  der skulle minimal vedligeholdelse til (dvs én tabel)
Avatar billede binderup Nybegynder
19. februar 2004 - 10:27 #6
men ok jeg kan vel også bare lave to sæt queries og så outputte dem samlet...
Avatar billede arne_v Ekspert
19. februar 2004 - 10:32 #7
Måske:

ORDER BY REPLACE(REPLACE(REPLACE(type,'Type A','AAA Type A'),'Type B','AAA Type A'), 'Type C', 'AAA Type C')
Avatar billede arne_v Ekspert
19. februar 2004 - 10:33 #8
Ja - en UNION af 2 queries var også en mulighed.
Avatar billede binderup Nybegynder
19. februar 2004 - 10:36 #9
Din replace virkede ikke - Coldfusion serveren var ikke glad :-)
Avatar billede arne_v Ekspert
19. februar 2004 - 10:41 #10
Hm - jeg troede faktisk at SQLServer accepterede sådan en brug af REPLACE.

Men det kan selvfølgelig være at driveren ikke kunne klare den.

Så tilbage til en af de andre løsninger.
Avatar billede binderup Nybegynder
19. februar 2004 - 11:42 #11
Det var ODBC driveren på serveren der brokkede sig
Avatar billede trer Nybegynder
19. februar 2004 - 11:48 #12
Hvad med at smide det i et view på serveren i stedet. Så er det ikke noget ODBC driveren ser?
Avatar billede binderup Nybegynder
19. februar 2004 - 11:54 #13
har du et link til noget dokumentation på Views - min baggrund er fra MySQL som jo er noget begrænset i sin funktionalitet
Avatar billede trer Nybegynder
19. februar 2004 - 11:57 #14
Et view er faktisk bare en predefineret select - simpel syntaks beskrivelse

create view myview
as
select bla bla
from tabel
ORDER BY REPLACE(REPLACE(REPLACE(type,'Type A','AAA Type A'),'Type B','AAA Type A'), 'Type C', 'AAA Type C')

det kan godt være, at du skal indsætte en TOP 100 PERCENT i din select  (SELECT TOP 100 PERCENT * FROM ...) for at kunne få lov at indsætte en order by.

I øvrigt - du kan finde dokumentationen i Books Online - installeret sammen med din Query Analyzer og Enterprise Manager. Hvis du ikke har den, så kan du downloade den fra www.microsoft.com/sql
Avatar billede arne_v Ekspert
19. februar 2004 - 12:05 #15
Der er iøvrigt et enkelt A der skal rettes til B i min replace !

:-)

Men et VIEW vil ihvertfald gøre at ODBC driveren ikke vil opdage noget.
Avatar billede trer Nybegynder
19. februar 2004 - 13:00 #16
Når du skal bruge viewet, så select'er du blot fra det, som var det en tabel.
Avatar billede binderup Nybegynder
20. februar 2004 - 10:48 #17
Løsningen var faktisk ikke så slem at komme frem til - jeg snakkede med en kollega om det (efter jeg var ved at lave mit system om til at køre med Coldfusions "Query on Queries"). Han kom med en dejlig one-liner:

ORDER BY CASE type when 'type a' then 1 when 'type b' then 2 when 'type c' then 3 else 4 end
Avatar billede trer Nybegynder
20. februar 2004 - 11:26 #18
Så får du ikke sorteret efter andet end de 3 første - øvrige vil være i tilfældig orden. Lav i stedet den sådan her:

ORDER BY CASE type when 'type a' then '1' when 'type b' then '2' when 'type c' then '3' else type end
Avatar billede binderup Nybegynder
20. februar 2004 - 12:00 #19
Det lader til at de faktisk kommer ud i korrekt orden ved de tests jeg har foretaget
Avatar billede trer Nybegynder
20. februar 2004 - 12:25 #20
Hmm.. interessant. Har du et clustered indeks på kolonnen?
Avatar billede arne_v Ekspert
06. marts 2004 - 15:36 #21
Lukke tid ?
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