Case

Hallo zusammen,
ich möchte über eine CASE Anweisung welches Datum das späteste ist, dazu
frage ich über verschiedene Spalten mittels CASE ab, nur gehts nich und ich weiß nicht warum:

SELECT 
                                              (CASE 
                                              WHEN max(pgt_tbl_tprj.tpr_plan_ende) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_tprj.tpr_plan_ende)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg6) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg6) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg6)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auftrag.auf_plan_ende) > max(pgt_tbl_tprj.tpr_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auftrag.auf_plan_ende)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg1) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg1) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg1)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg2) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg2) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg2)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg3) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg3) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg3)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg4) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg4) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg3)) + '2 month'::interval - '1day'::interval
                                              WHEN max(pgt_tbl_auf_ms.aufms_qg5) > max(pgt_tbl_tprj.tpr_plan_ende) OR max(pgt_tbl_auf_ms.aufms_qg5) > max(pgt_tbl_auftrag.auf_plan_ende)
                                              THEN date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg5)) + '2 month'::interval - '1day'::interval
      END)
                                       FROM (pgt_tbl_auftrag
                                          LEFT OUTER JOIN pgt_tbl_tprj ON
                                              pgt_tbl_tprj.tpr_auf_id = pgt_tbl_auftrag.auf_id
                                          LEFT OUTER JOIN pgt_tbl_auf_ms ON
                                              pgt_tbl_auf_ms.aufms_auf_id = pgt_tbl_auftrag.auf_id)
                                                WHERE pgt_tbl_auftrag.auf_pze='4257AA'

Was mache ich falsch?

Danke für eure Antworten

gruß
Andreas

Die Frage wäre bei einem einfacher lesbaren Beispiel einfacher zu beantworten. Kannst Du nicht eine abgemagerte Tabelle als Beispiel liefern?


Andreas

guten Morgen,
habe das ganze jetzt mal mit drei Test Tabellen versucht und gleiches falsches Ergebnis.

SELECT 
                                              (CASE 
                                              WHEN max(date_test1.datum) > max(date_test2.datum)
                                              THEN date_trunc('month', max(date_test1.datum)) + '2 month'::interval - '1day'::interval
                                              WHEN max(date_test2.datum) > max(date_test3.datum)
                                              THEN date_trunc('month', max(date_test2.datum)) + '2 month'::interval - '1day'::interval
           ELSE date_trunc('month', max(date_test3.datum)) + '2 month'::interval - '1day'::interval 
           END)
                                       FROM date_test1,date_test2,date_test3

Ziel ist es aus den drei Tabellen das max_datum rauszuholen, aber mit CASE schaff ich das nicht.
Irgendwie stell ich mich wohl gerade zu dumm an …
Also nochmal ich habe in dem Fall drei Tabellen mit je einem Datumsfeld, nun möchte ich über diese drei
Tabellen das “höchte” Datum ermitteln.

Wär toll wenn mir jemand helfen könnte :slight_smile:

Danke


Gruß
Andreas



test=# create table date_test1 (d date);
CREATE TABLE
Time: 208,967 ms
test=*# create table date_test2 (d date);
CREATE TABLE
Time: 28,824 ms
test=*# create table date_test3 (d date);
CREATE TABLE
Time: 0,669 ms
test=*# insert into date_test1 values (current_date +1);
INSERT 0 1
Time: 22,931 ms
test=*# insert into date_test2 values (current_date +2);
INSERT 0 1
Time: 0,410 ms
test=*# insert into date_test3 values (current_date +3);
INSERT 0 1
Time: 0,415 ms
test=*# select max(d) from (select d from date_test1 union all select d from date_test2 union all select d from date_test3) foo;
    max
------------
 2011-07-21
(1 row)

Time: 37,165 ms

Andreas

Hallo Andreas,
danke für deine Anwort.
Wenn ich das richtig verstehe funktioniert die Abfrage aber nur wenn die Datumsspalten den gleichen Namen haben oder?

Das ist bei mir eben nicht der Fall, wie würde das Ganze funktionieren wenn unterschiedliche
Spaltennamen vorhanden sind?

Danke

gruß
Andreas

Probier es doch einfach mal. Hint: es geht.

Andreas

Hallo Andreas,
hatte es versucht aber eben einen Fehler bekommen.
Jetzt hab ich mal auf die Testtabellen die Versuche gemacht.
Habe die Spalte für die zweite Tabelle einfach mal umbenannt, dann war die Abfrage folgende:

Spalte von date_test2 in datummm

select max(datum) from (select datum from date_test1 union all select datummm from date_test2 union all select datum from date_test3) foo;

Danach habe ich die Spalte in der Tabelle 1 auch umbenannt(in datum_m):

select max(datum) from (select datum_m from date_test1 union all select datummm from date_test2 union all select datum from date_test3) foo;

Dann kommt die Meldung:

ERROR:  column "datum" does not exist
********** Fehler **********
ERROR: column "datum" does not exist
SQL Status:42703

hmmm weiß auch ned so recht…

Gruß
Andreas

Die erste Tabelle von den UNION - Tabellen gibt den Spaltennamen vor. Du kannst aber auch via AS einen Namen angeben.

Andreas

Hallo Andreas,
das wars, jetzt gehts, zumindest über die Testtabellen.
Habe jetzt versucht das Ganze in meine Abfrage einzubauen, und da arbeite ich mit LEFT OUTER JOIN,
und schon wieder scheitere ich :frowning:

Habs mal so versucht:

SELECT  max(max_datum) from ((select date(date_trunc('month', max(pgt_tbl_tprj.tpr_plan_ende)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_tprj union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg1)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg2)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg3)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg4)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg5)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms union all
                                                select date(date_trunc('month', max(pgt_tbl_auf_ms.aufms_qg6)) + '2 month'::interval - '1day'::interval) as max_datum from pgt_tbl_auf_ms)
                                                foo
                                          LEFT OUTER JOIN pgt_tbl_tprj ON
                                              pgt_tbl_tprj.tpr_auf_id = pgt_tbl_auftrag.auf_id
                                          LEFT OUTER JOIN pgt_tbl_auf_ms ON
                                              pgt_tbl_auf_ms.aufms_auf_id = pgt_tbl_auftrag.auf_id)

und da motzt er:

ERROR:  missing FROM-clause entry for table "pgt_tbl_auftrag"

********** Fehler **********
ERROR: missing FROM-clause entry for table "pgt_tbl_auftrag"
SQL Status:42P01

Kannst mir da noch weiter helfen?

Danke

Gruß
Andreas

Nun ja, der Fehlertext ist ja eindeutig, oder?

Andreas