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'
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.
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
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?
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
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
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