2013-06-05 11 views
12

voglio ordinare prodotto di sconto su certa condizioneSql Ordinato per ... utilizzando `Caso When` per diversi Crescente, Ordini Discendente, e Custom

ORDER BY 
    CASE WHEN @OrderBy = 0 
    THEN table.id END ASC, 
    CASE WHEN @Orderby = 2 
    THEN table.id END ASC, 

voglio fare qualcosa di simile qui di seguito come ho don 't avere colonna sconto nella tabella

CASE WHEN @OrderBy = 4 
THEN (100-((table.price/table.oldprice)*100) as discount END ASC 

ma genera un errore - come è possibile ordinare in base allo sconto?

+3

Quale errore è vero gettando? –

+0

Rimuovi 'come sconto'. Si trova in un posto sbagliato (espressione interna) e non è possibile creare un alias di un'espressione in "order by" perché non ha senso. –

+0

sintassi errata vicino alla parola come –

risposta

21

Ci sono alcuni problemi, ad es. Non puoi fare alias di un campo di calcolo in un ordine per, e dovrai sfuggire al nome della tabella, correggere lo cae e contare le parentesi.

Inoltre, dal momento che sembra si vuole solo CASE su una singola variabile, è possibile spostare il @OrderBy verso la parte superiore del case, in questo modo:

SELECT * from [table] 
ORDER BY 
    CASE @OrderBy 
     WHEN 0 
      THEN [table].id -- ASC 
     WHEN 2 
      THEN [table].id * -1 -- DESC 
    ---I want to do something like below as I don't have discount column in table 
     WHEN 4 
      THEN (100-([table].price/[table].oldprice)*100) 
    END 

SqlFiddle Here

Per inciso , se è necessario modificare dinamicamente il ASC o DESC di una colonna, è possibile utilizzare un hack come this moltiplicando per -1.

(Si noti inoltre che ORDER BY CASE ... END ASC, CASE ... END ASC imposterà la prima e poi la seconda ordinamenti ... questo non sembra avere un senso, dato che @OrderBy può avere solo un valore singolo)

+0

Grazie StuartLc che ha risolto il mio problema –

+0

E in realtà ho usato asc e desc in ordine di CASO WHEN @OrderBy = 20 \t \t THEN (100- (table.price/table.oldprice) * 100) END DESC, –

4

Mi sembra avete bisogno di qualcosa di simile a questo

select * from TableName where someCondition >100 
    order by 
    case when @OrderBy = 'AirlineService' 
     then AirlineService END desc, 
    case when @OrderBy = 'SomeMore' 
     then MyOtherColumn end 
GO 

Se non si dispone di un coulmn allora non si può ordinare con quello. Si prega di leggere questo Microsoft Link Si prega di tenere presente - specifica l'ordinamento utilizzato sulle colonne restituite in un'istruzione SELECT. Spero che aiuti.

+0

Grazie per la vostra guida –

+0

Siete i benvenuti, una cosa più piccola, il nome della colonna che specificherete in ordine da sempre recuperato anche da quella colonna non è specificato nella lista di selezione. È possibile verificare questo comportamento con il piano di esecuzione. – Microtechie

+0

http://www.sqlfiddle.com/#!3/41859/1 di (StuatLc) risolto il mio problema, grazie per il supporto –

3

Non calcolare la riduzione del ORDER BY clausola ma nel SELECT

SELECT *, (100-(table.price/table.oldprice))*100 as discount 
FROM table 

...

ORDER BY 
CASE WHEN @OrderBy = 0 
THEN table.id END ASC, 
CASE when @orderby=2 
THEN table.id END ASC, 
CASE WHEN @OrderBy = 4 
THEN discount END ASC 
+0

Thanx controllerò –

+0

Hazaart In realtà possiamo calcolare lo sconto in base a, Sopra la soluzione funzionata (StuartLC's) per me È possibile visualizzare la demo su http: //www.sqlfiddle com/#! 3/41859/1 –

Problemi correlati