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’
;
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
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)