SQL order by

Pagina: 1
Acties:

  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
Heb een query die hier opneer komt:

[sql]
SELECT
id,
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END as days
FROM
atable
ORDER BY
days
[/sql]

Dus ik wil kijken hoeveel dagen er tussen een datum uit de db en een opgegeven datum zitten, deze wil ik dan sorteren. Het probleem is dat ik dus dit krijg:
id days
5 160
2 20
3 800
1 9

Zoals je zit sorteert hij niet als integer :(

  • Boss
  • Registratie: September 1999
  • Laatst online: 19:31

Boss

+1 Overgewaardeerd

Is je datediff functie wel goed? Moet je bij die functie niet nog een datepart argument opgeven? (verschil in dagen, jaren, minuten etc).

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
Nee dat hoeft niet. Hij geeft de dagen.
Heb al geprobeerd om de waarde met 1 te vermenigvuldigen maar dat hielp ook niet.

  • Mike78
  • Registratie: September 2000
  • Laatst online: 14:49

Mike78

Always

En als je er eens een integer waarde van maakt in je order by of een absolute waarde

24 uur per dag, 24 biertjes in een krat. Toeval?


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
Ik had dit al geprobeerd : CAST(days AS UNSEIGNED) in de order by.
Maar dan krijg ik dit : Unknown column 'days' in 'order clause' :(

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Wat gebeurt er als je een ELSE aan je CASE toevoegt, die numeriek (0) is?

Want DATEDIFF geeft dan wel een integer terug, maar aangezien je geen specifieke ELSE waarde geeft weet ik niet wat het type van het geheel is.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Moet je het CASE statement ook niet in de ORDER BY zetten ?

  • basz
  • Registratie: April 2000
  • Laatst online: 21-10-2025

basz

Professioneel prutser

Probeer het eens zo;

[sql]
SELECT
id,
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END as days
FROM
atable
ORDER BY
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END
[/sql]

Dat vind sql meestal leuker...

edit: TheRookie was me voor... Ik zou er wel zowiezo een ELSE bijzetten, gewoon voor de netheid...

[ Voor 26% gewijzigd door basz op 21-07-2006 09:40 ]


  • Mike78
  • Registratie: September 2000
  • Laatst online: 14:49

Mike78

Always

DaMinD schreef op vrijdag 21 juli 2006 @ 09:06:
Ik had dit al geprobeerd : CAST(days AS UNSEIGNED) in de order by.
Maar dan krijg ik dit : Unknown column 'days' in 'order clause' :(
Je kan niet verwijzen naar days op die manier. Maar volgens mij moet zoiets dan wel lukken

SQL:
1
order by CAST((CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1)) AS UNSEIGNED) 

24 uur per dag, 24 biertjes in een krat. Toeval?


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:30

Tomatoman

Fulltime prutser

Verander UNSEIGNED eens naar UNSIGNED. SQL houdt niet zo van spelfouten ;)

Een goede grap mag vrienden kosten.


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
Mike78 had gelijk.
De CAST op de CASE werkt perfect.
Hieronder het voorbeeld:
SQL:
1
2
3
4
5
6
7
SELECT
id,
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END as days
FROM
atable
ORDER BY
CAST((CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END) AS UNSIGNED)

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14-02 11:11

Dido

heforshe

Wat als je die CAST in de select clause zet, en dan gewoon ORDER BY 2 ?
Lijkt me zowel performance-wise handiger, en het wordt leesbaarder.

Wat betekent mijn avatar?


  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

DaMinD schreef op vrijdag 21 juli 2006 @ 10:51:
Mike78 had gelijk.
De CAST op de CASE werkt perfect.
Hieronder het voorbeeld:
SQL:
1
2
3
4
5
6
7
SELECT
id,
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END as days
FROM
atable
ORDER BY
CAST((CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END) AS UNSIGNED)
Het nadeel is dat dit natuurlijk performance kost. Waarom niet:
SQL:
1
2
3
4
5
6
7
SELECT id, days FROM (SELECT
id,
CASE WHEN date1 <= '2006-07-21' THEN DATEDIFF('2006-07-21',date1) END as days
FROM
atable)
ORDER BY
days

[ Voor 17% gewijzigd door Wim-Bart op 21-07-2006 11:20 ]

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14-02 11:11

Dido

heforshe

eh, wim-bart: misschien omdat in de topicstart staat dat dat niet werkt? ;)

Maar die cast moet volgens mij wel in de slect kunnen.

Wat betekent mijn avatar?


  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Als de uitkomst van datediff een (Var)char is, zal je hem moeten casten

Maar waarom niet gewoon de data van elkaar aftrekken (iig Oracle ondersteunt dit, net geprobeerd)

SQL:
1
2
3
4
5
6
7
8
Select id
     , days
  From ( Select id
              , Case When date1 <= To_Date( '2006-07-21', 'RRRR-MM-DD')
                     Then To_Date( '2006-07-21', 'RRRR-MM-DD') - date1
                End As days
           From atable)
Order By days

  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
Die CASE kan ook in de select maar dan kan ik hem dus niet goed meer sorteren.
Maar die case in de ORDER werkt goed. En van de snelheid merk ik hier niets.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL Server evalueert alle mogelijke uitkomsten van CASE, en retourneert het datatype dat in de volgorde van het datatype preferentie schema van SQL Server het hoogst staat.

Het lijkt erop dat omdat er geen ELSE is het datatype geen INT is, maar een karakter datatype.

[ Voor 4% gewijzigd door P_de_B op 21-07-2006 11:55 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 29-01 09:18
P_de_B schreef op vrijdag 21 juli 2006 @ 11:54:
SQL Server evalueert alle mogelijke uitkomsten van CASE, en retourneert het datatype dat in de volgorde van het datatype preferentie schema van SQL Server het hoogst staat.

Het lijkt erop dat omdat er geen ELSE is het datatype geen INT is, maar een karakter datatype.
Als je er een ELSE '9999999999999' neer zet is het nog steeds geen INT. Als je de CASE in je SELECT gebruikt.
Maar voor de duidelijkheid: het probleem is opgelost met de oplossing va Mike78. De CASE en CAST in de ORDER BY is goed genoeg voor mijn.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Dido schreef op vrijdag 21 juli 2006 @ 11:51:
eh, wim-bart: misschien omdat in de topicstart staat dat dat niet werkt? ;)

Maar die cast moet volgens mij wel in de slect kunnen.
Als je goed kijkt zie je dat wim-bart een nested query gebruikt, en days dus nu wel degelijk gebruikt kan worden.
DaMinD schreef op vrijdag 21 juli 2006 @ 11:59:
[...]


Als je er een ELSE '9999999999999' neer zet is het nog steeds geen INT. Als je de CASE in je SELECT gebruikt.
Misschien ook omdat '99999999999' ook een string is, die toevallig lijkt op een nummer?

[ Voor 32% gewijzigd door Robtimus op 21-07-2006 13:58 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • wboevink
  • Registratie: September 2004
  • Laatst online: 09-02 17:21
Dit moet toch ook lukken.

SELECT
id,
DATEDIFF('2006-07-21',date1) as days
FROM
atable
WHERE date1 <= '2006-07-21'
ORDER BY
days

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14-02 11:11

Dido

heforshe

IceManX schreef op vrijdag 21 juli 2006 @ 13:57:
Als je goed kijkt zie je dat wim-bart een nested query gebruikt, en days dus nu wel degelijk gebruikt kan worden.
Doet die nested query een impliciete cast naar int dan?

Wat betekent mijn avatar?

Pagina: 1