SQL-Bedingung verwenden von Spalten in der where-Klausel

Etwas Hintergrundwissen. Meine Firma hat eine Anwendung, die dauert eine SQL-Abfrage, verwendet dann die Werte, die es gibt, produzieren Grafiken und K. P. I. s aus. In meinem problem-wir erzeugen einen Graphen zeigen die Gesamtzahl der Bestellungen, aufgeschlüsselt nach Versand "route" für eine bestimmte formatierte Datum.

Gibt es zwei Tabellen beteiligt, um header (ORDERS) und Gegenstände (ITEMS).

Das Programm erfordert zwei Felder, XAxis und YAxis übergeben werden, um es zu produzieren, graph. Die Grafik die wir wollen, zu produzieren, hat die Route Referenz (Text) als der in X-Richtung und eine Summe von Elementen als YAxis.

Komplikationen auftreten, mit der route. Die route kann geändert werden, indem die Operationen vor dem Versand der neuen route gespeichert ist in ein anderes Feld; nennen wir diese OLDROUTE und NEWROUTE. Wenn NEWROUTE ist leer, dann sind Sie mit der OLDROUTE. Wenn NEWROUTE Wert dann verwenden NEWROUTE as XAxis.

Dem Datum unserer Tische ist eine ganze Zahl im format YYMMDD. Den code zu generieren dynamisch ist gegeben als

@DATE=(((year(curdate())-2000)*10000)+(month(curdate())*100)+(day(curdate()))) 

Dies ist im Vergleich mit dem Feld DESPDATE bekommen alle Bestellungen, die heute abgeschlossen.

Habe ich eine version, die funktioniert, unten geschrieben

select CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end AS XAxis,  SUM(ITEMS.QUANTITY) as YAxis
FROM ORDERS
join ITEMS
on ORDERS.ORDNUM=ITEMS.ORDNUM
where 
ORDERS.DESPDATE=@DATE    
and ORDERS.STATUS='COMPLETE'
group by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end
order by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end

Diese funktioniert einwandfrei. Jetzt kommt es zu Komplikationen, wenn Sie möchten, verwenden Sie ein anderes Feld für eine bestimmte Strecke. So zum Beispiel: für die Strecke (X-Richtung) = 'PARCEL' verwenden möchten ORDERS.ISSUEDATE für die route 'BOX' Sie verwenden möchten ORDERS.PACKDATE und für alles, was Sie sonst noch wollen, dass es das gleiche zu sein.

Also der neue code wäre so etwas wie:

select CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end AS XAxis,  SUM(ITEMS.QUANTITY) as YAxis
FROM ORDERS
join ITEMS
on ORDERS.ORDNUM=ITEMS.ORDNUM
where 
CASE WHEN XAxis='PARCEL' then ORDERS.ISSUEDATE=@DATE 
ELSE WHEN XAxis='BOX' then ORDERS.PACKDATE=@DATE
else ORDERS.DESPDATE=@DATE end
and ORDERS.STATUS='COMPLETE'
group by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end
order by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end

Funktioniert das nicht. IST es eigentlich möglich, verschiedene Felder der Tabelle in einer where-clase case-Anweisung? Fragen Sie mehr, als wir liefern können?

Ich habe versucht, eine ähnliche Abfrage zu verwenden, WENN stattdessen der FALL ist, aber habe nicht hatte keinen Erfolg mit ihm.

InformationsquelleAutor vice | 2011-11-07

Schreibe einen Kommentar