05. juni 2005 - 13:51Der er
16 kommentarer og 1 løsning
Sorter over 3 felter
Hej eksperter,
jeg har en access databse, med tre felter: StadeNr, StadeNr_1, StadeNr_2.
De indeholder alle numre og kan indeholde alt fra 0 - 67 default er 0, hvis andet ikke er valgt.
jeg skal vise en liste med alle tal fra de tre felter, men sorteret (ORDER BY) ASC, med komma som seperator.
udtrækket er enkelt, men sorteringen er ikke så nem.
Min Ide er at samle alle felter i en streng, og så sortere strengen inden jeg laver min Response.write.
Har i et andet forslag.
/Jesper
KODE:
<% Dim strDatoValgt StrDatoValgt = strDato if request.querystring("AutoID")<>"NewRecord" then SQL = "SELECT Dato,StadeNr,StadeNr_1,StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' " set oRS8 = oDB.Execute(SQL) oRS8.Movefirst do while not oRS8.EOF IF oRS8("StadeNr") OR oRS8("StadeNr_1") OR oRS8("StadeNr_2")<> 0 then strTotalStader = oRS8("StadeNr") & "," & + oRS8("StadeNr_1") & "," & + oRS8("StadeNr_2") end if response.write strTotalStader oRS8.Movenext Loop End IF oDB.Close set oRS8 = Nothing %>
SQL = "SELECT Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeNr ASC, StadeNr_1 ASC, StadeNr_2 ASC"
Hvis du skal til at kombinere Stade, StadeNr_1 og StadeNr_2 til en streng først, så kan dette også gøres. Løsningen bliver dog noget mere besværligt og syntaksen afhænger af hvilken database du bruger (nedenstående eksempel er for MS Access):
InnerSQL = "SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
OuterSQL = "SELECT * FROM (" & InnerSQL & ") ORDER BY OrderID"
Endvidere skal du være klar over at sorteringen nu bliver leksikografisk (dvs. den samme som i et leksikon):
jeg bruger en MS Access database, og har førsøgt med dit 2. forslag med innerSQL og outerSQL - dog kan jeg ikke gennemskue hva du gør først i SQl select statementet? - Du selecter alle 3 felter med et bindestreg i mellem som et felt StadeID og så dato flett samt de første tre felter igen??? eller misforstår jeg dit forslag?
Det er korrekt forstået. Der er nu ingen hemmelig grund til at jeg gør det på lige den måde - det var bare den hurtigste måde at lave en demo ud fra dit eget kodeeksempel. Du skal selvfølgelig kun SELECTe det som du vil have.
Lidt om min StadeID... Det var dig selv som startede med at nævne noget med "at samle alle felter i en streng", og det er det som jeg så gør med StadeID; Jeg laver en streng på formen "7-9-13". Hvis du salv vil have et andet format kan du bare gøre det. Aller helst ville jeg have lavet et eksempel hvor det kunne gøres med en samlet SQL, men det viste sig at man ikke umiddelbart kunne sortere med ORDER BY på StadeID:
SQL = "SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeID"
I stedet bruger jeg altså en subquery:
"SELECT * FROM (SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "') ORDER BY StadeID"
- og, for at strukturen skulle være mere synlig, delte jeg denne i en InnerSQL og en OuterSQL.
jeg har fået dit forslag til at virke og forstår nu hvad du gør, men det hjælper mig ikke rigtig. desværre. det er lidt vigtigt at tallene fra de tre felter står i den rigtige rækkefølge ellers bliver det for besværligt at overskue, og da jeg har en masse "0" i felterne som jeg gerne vil sortere fra, så giver det lidt problemer. kan du hjælpe mig med den løsning med en streng eller et Array måske?
nu spørger jeg lige om et andet spørgsmål osm måske ville være lettere end denne løsningen jeg leder efter her.
det er selvfølgelig flere points hvis du mener det er lettere eller løsningen er lettere at skrive.
Spørgsmål: udgangspunkt i felterne som før beskrevet, 3 felter med tal i max 67 pr. felt. I en anden tabel har jeg alle nr, fra 1-67 og hvis jeg vil pare disse to tabeller, så jeg kun for de tal som ikke er i begge tabeller??
Du skriver at du ikke vil have 0’er med. Betyder det at rækker, hvor bare en af søjlerne StadeNr, StadeNr_1 eller StadeNr_2 er 0, slet ikke skal med? Eller betyder det rækken skal med, men at 0’et bare ikke skal med i output?
Kan du ikke lige give mig en typisk samling af inddata og så fortælle mig hvordan output skal se ud? Så kan vi tage den derfra.
SQL1 = "SELECT StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'" SQL2 = "SELECT StadeNr_1 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'" SQL3 = "SELECT StadeNr_2 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
SQL = "SELECT StadeNr FROM ((" & SQL1 & ") UNION (" & SQL2 & ") UNION (" & SQL3 & ")) WHERE StadeNr<>0"
Dim strDatoValgt StrDatoValgt = "05-06-2005" if request.querystring("AutoID")<>"NewRecord" then SQL1 = "SELECT StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'" SQL2 = "SELECT StadeNr_1 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'" SQL3 = "SELECT StadeNr_2 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
SQL = "SELECT StadeNr FROM ((" & SQL1 & ") UNION (" & SQL2 & ") UNION (" & SQL3 & "))WHERE StadeNR<>0"
set oRS = oDB.Execute(SQL) oRS.Movefirst do while not oRS.EOF response.write oRS("StadeNr") & "," oRS.Movenext Loop End IF oDB.Close set oRS = Nothing %>
jeg har brugt din metode, men har omskrevet den til en SQL sætning:
SQL = "SELECT Dato,StadeNr FROM (SELECT Dato,StadeNr FROM main UNION ALL SELECT Dato,StadeNr_1 AS StadeNr FROM main UNION ALL SELECT Dato,StadeNr_2 AS StadeNr FROM main) WHERE StadeNr<>0 AND Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeNr"
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.