2013-06-05 3 views
12

Ich möchte von Rabatt auf bestimmte Bedingung Produkt sortierenSql Order By ... mit `Fall When` für verschiedene aufsteigend, absteigend und Bestellungen Benutzerdefinierte

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

ich so etwas wie unten, wie ich don tun wollen Keine Rabattspalte in Tabelle

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

aber es wirft einen Fehler - wie kann ich nach Rabatt sortieren?

+3

Welche Fehler es zu werfen? –

+0

Entfernen Sie 'als Rabatt'. Es ist an einer falschen Stelle (im Ausdruck), und Sie können einen Ausdruck nicht in der Reihenfolge sortieren, da es keinen Sinn ergibt. –

+0

falsche Syntax in der Nähe des Wortes als –

Antwort

21

Es gibt ziemlich viele Probleme, z.B. Sie können ein Berechnungsfeld nicht in einer Reihenfolge nach Aliasnamen benennen, und Sie müssen den Tabellenname umgehen, die cae fixieren und die Klammern zählen.

Auch, weil es scheint, möchten Sie gerade CASE auf einer einzigen Variablen, können Sie die @OrderBy heraus an die Spitze des CASE, wie so bewegen:

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

Als Neben , wenn Sie die ASC oder DESC einer Spalte dynamisch ändern müssen, können Sie einen Hack wie this verwenden, indem Sie mit -1 multiplizieren.

(Beachten Sie auch, dass ORDER BY CASE ... END ASC, CASE ... END ASC die ersten und dann die zweite Reihenfolgen gesetzt ... das scheint nicht Sinn gegeben, dass @OrderBy kann nur einen einzigen Wert haben)

+0

Dank StuartLc Das ist mein Problem –

+0

gelöst und ich habe tatsächlich asc und desc um von CASE WHEN @OrderBy = 20 \t \t DANN (100- verwendet (table.price/table.oldprice) * 100) END DESC, –

4

Es scheint mir, müssen Sie etwas ähnlich wie diese

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

Wenn Sie keine coulmn haben, dann können Sie nicht mit dem sortieren. Bitte lesen Sie diese Microsoft Link Bitte beachten Sie - gibt die Sortierreihenfolge für Spalten in einer SELECT-Anweisung zurückgegeben. Hoffe es hilft.

+0

Danke für Ihre Anleitung –

+0

Sie sind willkommen, eine weitere kleine Sache, Spaltenname, den Sie in der Reihenfolge angeben, wird immer abgerufen, auch wenn diese Spalte nicht in der Auswahlliste angegeben ist. Sie können dieses Verhalten mit dem Ausführungsplan überprüfen. – Microtechie

+0

http://www.sqlfiddle.com/#!3/41859/1 By (StuatLc) mein Problem gelöst, Dank für ur Unterstützung –

3

Sie den Rabatt in der nicht berechnen ORDER BY Klausel aber in der 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

Danke ich werde überprüfen –

+0

Hazaart Eigentlich können wir Rabatt in der Reihenfolge berechnen, über die Lösung funktioniert (StuartLCs) für mich Sie können Demo auf http: //www.sqlfiddle sehen .com/#! 3/41859/1 –