Frage zu Datensätze (Periode untereinander in Periode nebeneinander) übernehmen

Hallo,

bezgl. PostGre.

Möchte gerne die Anzahl der Datensätze einer Tabelle (facts_budget) und dadurch die Performance der Datenbank verbessern.

In der Tabelle liegen die Datensätze periodenweise untereinander (Spalte Jahr, Monat, Wert).

Diese sollen jetzt in eine neue Tabelle überführt werden, wo für jeden Monat eine Wertspalte vorhanden ist. (Jahr, Wert01, Wert02, …Wert12). => hierdurch wird die Anzahl der Datensätze auf ein 12tel reduziert.

Mit folgendem SQL habe ich es ausprobiert. Stosse auf ein Problem, dass Datenbanksätze, wo Tabellenspalten NULL Werte enthalten nicht mit übergeben werden.

Könnt Ihr erkennen, was an dem folgenden SQL falsch ist?



insert into “facts_budget_new”
select “Bezugsjahr”, “Buchungskreis”, “Account”,“Geschäftsbereich”,
“Währungsschlüssel”, “Vorgangsart”, “SparteKey”, “VWegKey”, “VkBueroKey”,
“KontraktartKey”
from “v_facts_budget”
EXCEPT
select “Bezugsjahr”, “Buchungskreis”, “Account”,“Geschäftsbereich”,
“Währungsschlüssel”, “Vorgangsart”, “SparteKey”, “VWegKey”, “VkBueroKey”,
“KontraktartKey”
from “facts_budget_new”
;
update “facts_budget_new”
set “Ist10” = b.“Wert”
from “v_facts_budget” b
where
“facts_budget_new”.“Bezugsjahr” = b.“Bezugsjahr” AND
“facts_budget_new”.“Buchungskreis” = b.“Buchungskreis” AND
“facts_budget_new”.“Account” = b.“Account” AND
“facts_budget_new”.“Geschäftsbereich”= b.“Geschäftsbereich” AND
“facts_budget_new”.“Währungsschlüssel” = b.“Währungsschlüssel” AND
“facts_budget_new”.“Vorgangsart” = b.“Vorgangsart” AND
“facts_budget_new”.“SparteKey” = b.“SparteKey” AND
“facts_budget_new”.“VWegKey” = b.“VWegKey” AND
“facts_budget_new”.“VkBueroKey” = b.“VkBueroKey” AND
b.“PlanIst-Kennzeichen” = ‘Ist-Daten’ AND
b.“Bezugsjahr” = ‘2007’ AND
b.“Bezugsperiode” = ‘10’
;

Danke vorab für Eure Hilfe.

Grüsse,

arcplan

Soweit, so schlecht. DATE als Datentyp existiert.

Diese sollen jetzt in eine neue Tabelle überführt werden, wo für jeden Monat eine Wertspalte vorhanden ist. (Jahr, Wert01, Wert02, …Wert12). => hierdurch wird die Anzahl der Datensätze auf ein 12tel reduziert.

Gleichzeitig aber:

  • erhöhst Du massiv die Breite der Zeilen
  • kannst nicht mehr nach Werten eines Monats suchen, zumindest nicht via Index



  • Hast Du denn jetzt ein Performance-Problem?


    Andreas

Hallo,

danke für die Antwort.

Frage standardmässig die Monate in einem SELECT für das ganz Jahr ab. Perfomance ist dadurch besser (WERT01, …,WERT12). Das ist so gewollt.

Wie bekomme ich denn nun die Datensätze von Tabelle 1 zu Tabelle2 (Wert01 bis 12) umgeschaufelt?

Danke vorab für die Antwort.

Grüsse,

arcplan

Nunja - das blöde an der folgenden Lösung ist, dass sie auch eine Lösung dafür ist - die sequentiellen Monate in einem Select abzufragen :slight_smile:

du joinst halt die tabelle mit sich selbst und jeweils mit der bedinung monat bzw. bezugsperiode …



test=*# create table werte (jahr int, monat int, wert int);
CREATE TABLE
test=*# copy werte from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 2008 01      10
>> 2008 02      20
>> 2008 03      30
>> \.
test=*# commit;
COMMIT
test=# select jahr, sum("01") as "01", sum("02") as "02" from (select jahr, case when monat=1 then wert else 0 end as "01", case when monat=2 then wert else 0 end as "02" from werte) foo group by jahr;
 jahr | 01 | 02
------+----+----
 2008 | 10 | 20
(1 row)

Andreas