Avatar billede sneakraid Nybegynder
11. november 2005 - 12:58 Der er 39 kommentarer og
1 løsning

Sortering af dataudtræk?

Hej eksperter :)

Jeg sidder med en ejendomsmægler side, som selvf. har en liste med ejendomme. Den liste er sorteret efter postnumre. Nu skal jeg så lave sådan man selv kan bestemme hvordan man vil sortere den liste. F.eks. lad os  sige der findes følgende postnumre:

8800
8900
9000
9100
9200

Så skal jeg kunne bestemme at øverst i listen, skal der listes ejendomme med postnummer "9000" og så skal resten af listen ellers bare komme.

Kan i hjælpe mig til hvordan jeg gør det ?
Avatar billede fennec Nybegynder
11. november 2005 - 13:13 #1
Du skal over i noget ala dette:

select 1 as sort, * from dinTabel where post=9000
union
select 2 as sort, * from dinTabel where post<>9000
order by sort
Avatar billede softspot Forsker
11. november 2005 - 13:14 #2
du kynne måske gøre brug af union, dvs. sammensætte to selects, hvor den første udvælger alle rækker med postnr 9000 og den anden vælger alle de række som ikke har postnr 9000.

Eksempel:

select * from tabel where postnr = 9000
union
select * from tabel where postnr != 9000 order by postnr
Avatar billede sneakraid Nybegynder
11. november 2005 - 13:41 #3
Jeg har testet jeres eksempler lidt. Men får en fejl:

-----------------
Microsoft JET Database Engine error '80040e14'

Syntax error (missing operator) in query expression 'postnr != '9000''.
------------------

Er der noget forkert i min sql sætning ?

sql = "SELECT * FROM bolig WHERE postnr = '9000' UNION SELECT * FROM bolig WHERE postnr != '9000' ORDER BY postnr"
Avatar billede softspot Forsker
11. november 2005 - 13:43 #4
det er nok fordi != ikke fungerer i access (jeg antog en SQL Server) - du skal nok bruge fennec's notation for "forskellig fra", altså <>
Avatar billede knico Nybegynder
11. november 2005 - 13:45 #5
!= er en java/oracle ting. Så vidt jeg kan se bør fennecs virke, men hvis du også vil have de følgende sorteret så de ligger efter hinanden tror jeg du må gøre noget lignende det her:
select * from (
select 1 as sort, * from dinTabel where post=9000
union
select 2 as sort, * from dinTabel where post<>9000)
order by sort, post
Avatar billede sneakraid Nybegynder
11. november 2005 - 13:49 #6
arh, det var vist min fejl .. jeg skulle lige have fortalt det var en access database jeg sidder med :)

Nu har jeg prøvet med fennec's eksempel, men får følgende fejl:

--------------
Microsoft JET Database Engine error '80040e10'

No value given for one or more required parameters.
---------------

Med denne sql sætning:

sql = "select 1 as sort, * from bolig where post='9000' union select 2 as sort, * from bolig where post<>'9000' order by sort"
Avatar billede softspot Forsker
11. november 2005 - 13:54 #7
Umiddelbart ved jeg ikke hvorfor der skal selected på 1 og 2, så jeg ville bare foreslå at du benytter min blot med den ændring at du benytter <> i stedet for !=...
Avatar billede sneakraid Nybegynder
11. november 2005 - 13:57 #8
Ja, jeg må os nok indrømme at jeg ik forstår det med select 1 og 2. Men nu prøvede jeg med din sql sætning, bare med <> i stedet for !=.
Det resulterede i følgende fejl:

----------------
Microsoft JET Database Engine error '80040e07'

Data type mismatch in criteria expression.
----------------

Med sql sætning:

sql = "SELECT * FROM bolig WHERE postnr = '9000' UNION SELECT * FROM bolig WHERE postnr <> '9000' ORDER BY postnr"
Avatar billede knico Nybegynder
11. november 2005 - 13:58 #9
Fordi så får du blot en sortering af recordsættet efter postnummer i stigende orden. Det bringer ikke 9000 op forrest.
Avatar billede knico Nybegynder
11. november 2005 - 13:58 #10
Dit postnummer er numerisk så du skal fjerne ' og ' omkring 9000
Avatar billede fennec Nybegynder
11. november 2005 - 13:58 #11
Hvad hedder postnummer kollonen og hvilken datatype er det??
Nu har du både kaldt den post og postnr..
Avatar billede fennec Nybegynder
11. november 2005 - 14:00 #12
Du skal bruge sort metoden.
sql = "select 1 as sort, * from bolig where postnr=9000 union select 2 as sort, * from bolig where postnr<>9000 order by sort"

Order by virker nemlig på ALLE select i en union, og den blander resultaterne.
Avatar billede softspot Forsker
11. november 2005 - 14:01 #13
hmm... jeg sidder lige og tester union i en access-database og jeg synes ærlig talt ikke den returnerer det jeg forventer!? Jeg har prøvet at sætte parantes omkring de to selects og det bliver lidt bedre, men stadig ikke som forventet...

sql = "(SELECT * FROM bolig WHERE postnr = '9000') UNION (SELECT * FROM bolig WHERE postnr <> '9000' ORDER BY postnr)"

Ifht. den fejl du får, er postnr så en streng/tekst og ikke et nummer?
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:05 #14
Okay, ja der fuckede jeg da vist lige op i sql'en.

Postnummer kollonnen hedder "postnr" og er af datatypen "Tal".
Jeg har nu prøvet med følgende sql sætning:

sql = "SELECT * FROM bolig WHERE postnr = 9000 UNION SELECT * FROM bolig WHERE postnr <> 9000 ORDER BY postnr"
Avatar billede fennec Nybegynder
11. november 2005 - 14:07 #15
Prøv min fra 14:00:36. Du skal bruge sort metoden...
Avatar billede softspot Forsker
11. november 2005 - 14:08 #16
husk paranteserne (i det mindste omkring den sidste select - inklusive order by postnr)... :)
Avatar billede fennec Nybegynder
11. november 2005 - 14:10 #17
softspot >>
Det er lige meget med parenteser. Order by virker på alle resultaterne lige meget hvor den er placeret i koden.

I skal se det som om den henter alle resultaterne fra de enkelte select, også kører order by bagefter...
Avatar billede softspot Forsker
11. november 2005 - 14:11 #18
ja ok, så kan man bare sortere sekundært på postnr, hvis de skal sorteres... smart nok :)
Avatar billede softspot Forsker
11. november 2005 - 14:12 #19
fennec (11/11-2005 14:10:05) >> det er ikke det jeg oplever når jeg tester i access :)
Avatar billede softspot Forsker
11. november 2005 - 14:14 #20
...jeg oplever faktisk bare at order by slet ikke fungerer!?
Avatar billede fennec Nybegynder
11. november 2005 - 14:17 #21
softspot>>
Det var egentlig mærkelig. Jeg har lige kørt dit eks og der fungere order by fint (alle resultater er sorteret efter postnr)
Avatar billede softspot Forsker
11. november 2005 - 14:18 #22
hmm... altså ALLE rækker på tværs af union?
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:19 #23
Det var da de underligste udtræk jeg har set.

fennec > Jeg prøvede din fra 14:00:36 og fik så retuneret de samme ejendomme 12 gange i træk.

softspot > Jeg prøvede os din sql sætning og fik også retuneret de samme ejendomme 12 gange, bare i total random orden.

Ved ik helt hvad der sker. Kan være i skal se mere kode?. Men hvis det hjælper så ser udtrækket normalt f.eks. sådan her ud:

8900
-------------------
Bolig1
Bolig2
Bolig3
Bolig4

9000
------------------
Bolig1
Bolig2
Bolig3
Avatar billede fennec Nybegynder
11. november 2005 - 14:19 #24
softspot >>
... Min fejl, de er faktisk en enkelt der ikke står rigtigt :o)
Avatar billede fennec Nybegynder
11. november 2005 - 14:21 #25
sneakraid >>
Kan du lægge databasen ud så vi kan hente den??
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:24 #26
fennec > Jeg kan nok ik give jer den database jeg sidder med. Men jeg kan kopiere tabellen "bolig" + data i en ny database og smide et link til jer, så i kan teste lidt? :)
Avatar billede softspot Forsker
11. november 2005 - 14:25 #27
Det er fint nok :)
Avatar billede softspot Forsker
11. november 2005 - 14:28 #28
Jeg har prøvet fennec's metode (på en tabel med 300 rækker) og det ser ud til at fungere godt nok her...

sql = "select 1 as sort, * from bolig where postnr=9000 union select 2 as sort, * from bolig where postnr<>9000 order by sort, postnr"

Så nu bliver det jo spændende at se hvordan din tabel adskiller sig fra den jeg har siddet og testet på... :)
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:29 #29
Det kan umiddelbart godt se lidt rodet ud, men det må i lige bære over med :)
Ejendommene skal jo bare listes efter postnumrene.

http://www.satneme.dk/lasse/files/ejendomme.mdb
Avatar billede softspot Forsker
11. november 2005 - 14:49 #30
Det her fungerer da godt nok...:

SELECT 1 as sort, *
FROM bolig
where postnr = 9000
union
select 2 as sort, *
from bolig
where postnr <> 9000
order by sort, postnr;
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:52 #31
Men hvordan ser din liste så ud?
Avatar billede sneakraid Nybegynder
11. november 2005 - 14:55 #32
Jeg prøver selv lige at teste lidt .. Jeg smutter fra arbejde nu, så jeg sidder her først igen i aften.

Men fortsæt go' eftermiddag ;)

Og tak for hjælpen indtil videre.
Avatar billede softspot Forsker
11. november 2005 - 14:57 #33
postnr    bynavn
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
9000    Aalborg
8500    Grenå
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
8900    Randers
9220    Aalborg Ø
9230    Svenstrup
9330    Dronninglund
9400    Nørresundby
9490    Pandrup
9490    Pandrup
9520    Skørping
9620    Aalestrup
9681    Ranum
9870    Sindal
Avatar billede sneakraid Nybegynder
14. november 2005 - 08:09 #34
Det blev først efter weekenden jeg kunne være her på experten igen.

Men jeg har kigget lidt på det vi har fundet frem til, og det ser meget fint ud og det virker som det skal.

Men nu er mit problem bare at få "listen" til at se nogenlunde såen her ud:

9000 Aalborg:
-----------------
Bolig1
Bolig2
Bolig3
Bolig4

8500 Grenå
-----------------
Bolig5

8900 Randers
-----------------
Bolig6
Bolig7
Bolig8

Er det noget i kan hjælpe med? Fordi den kan jeg ik lige regne ud.
Avatar billede fennec Nybegynder
14. november 2005 - 08:17 #35
oldPost = ""
set rs = conn.execute("...")
while not rs.eof then
  if oldPost <> rs("postnr") then
    response.write rs("postne") &" "& rs("city") &"<br>"
  end if
  response.write rs("bolig") &"<br>"
  oldPost = rs("postnr")
  rs.MoveNext
wend
Avatar billede sneakraid Nybegynder
14. november 2005 - 09:17 #36
Det virker.
Mange tak fennec :)

softspot du må hellere lige smide et svar.

Så får i jeres velfortjente point. Og tak for hjælpen gutter ;)
Avatar billede softspot Forsker
14. november 2005 - 10:43 #37
Tak for budet, men jeg synes det er fennec's fortjeneste, så du smider bare point efter ham... :)
Avatar billede sneakraid Nybegynder
14. november 2005 - 10:54 #38
Hehe okay, fair nok. Men tak for hjælpen alligevel softspot ;)
Avatar billede fennec Nybegynder
14. november 2005 - 10:57 #39
Så siger jeg da tak.
.o) <-- One Eyed Jack
Avatar billede softspot Forsker
14. november 2005 - 11:12 #40
Velbekomme :)
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
Kurser inden for grundlæggende programmering

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