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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach
OR
in einigen Klammern Filter:Eine sehr einfache Idee; es sollte funktionieren, aber beim Versuch, führen Sie diese auf die AS/400 Green-screen produziert er die Meldung "- Spalte in X-Richtung nicht in den angegebenen Tabellen". DB2 scheint nicht, wie mit alias in der where-Klausel. Scheint, Sie haben, eine Ansicht oder eine abgeleitete Tabelle zu umgehen. Wird ein wenig mehr von einem Spiel und sehen, was passiert.
Im Allgemeinen, Sie können NICHT verwenden Sie spaltenaliasnamen in der Anfang der WÄHLEN Sie in der WO. Sie könnte jedoch die doppelte definition.
Die obigen Vorschläge, modifizierte ich die X-Achse Formel-arbeiten mit string-Funktionen, anstelle von einer case-Anweisung. Dann mehrere
OR
in der where-Klausel, um die gewünschte Funktionalität zu erhalten. Vielen Dank für Ihre Hilfe. Für alle interessierten der X-code ist jetzt:SELECT SUBSTR(TRIM(SUBSTR(ORDERS.NEWROUTE,1,6))||SUBSTR(ORDERS.OLDROUTE,1,6),1,6) AS XAxis
. Dies wiederholt sich in den where -, group und order by-Klauseln.InformationsquelleAutor JNK