Was möchte ich erreichen?
- Ich möchte aus einer Tabelle mit folgendem Plaintext:
identify serial NOT NULL,
callrefnummer text NOT NULL,
datum date,
uhrzeit time,
eingangsport int4,
ausgangsport int4,
eingangsnummer text,
ausgangsnummer text,
dauer int4,
releasecode text,
CONSTRAINT call_pkey PRIMARY KEY (identify)
die ausgangsnummer mit den dialcodes aus dieser Tabelle vergleichen
identify serial NOT NULL,
dialcode text,
name text,
CONSTRAINT destination_pkey PRIMARY KEY (identify)
dazu benutze ich diesen View
CREATE OR REPLACE VIEW call_desti AS
SELECT grouped_calls.dauer, ( SELECT destination.dialcode
FROM destination
WHERE grouped_calls.ausgangsnummer ~~ (destination.dialcode || '%'::text)
ORDER BY char_length(destination.dialcode) DESC
LIMIT 1) AS "location"
FROM ( SELECT call.ausgangsnummer, call.dauer
FROM call) grouped_calls;
So weit so gut. nun habe ich alles was ich brauche :
Die Daten aus Call, Destination und schließlich die zusammengeführten Daten aus call_desti, damit ich die Destination der Calls bestimmen kann.
nun nützt mir eine riesige Liste natürlich nichts, ich will sie Gruppieren:
dazu benutze ich dann
CREATE OR REPLACE VIEW call_destination AS
SELECT call_desti."location", destination.name, count(*) AS count, sum(call_desti.dauer) / 60000 AS dauer, max(asr."numeric") AS sum
FROM destination, call_desti, asr
WHERE destination.dialcode = call_desti."location" AND asr."location" = call_desti."location"
GROUP BY call_desti."location", destination.name;
Doch nun brauche ich einen etwas Komplizierteren Wert, der sich “ASR” nennt. er bedeutet einfach :
Einträge die eine nicht leere Dauer-Zeile haben geteilt durch alle Einträge einer Destination.
Also rechne ich diesen Wert in den restlichen views aus.
CREATE OR REPLACE VIEW asr AS
SELECT (call_zustande.anzahl::numeric(10,2) / call_alle.count::numeric(10,2) * 100::numeric)::numeric(10,2) AS "numeric", call_zustande."location"
FROM call_zustande, call_alle
WHERE call_zustande."location" = call_alle."location";
CREATE OR REPLACE VIEW call_alle AS
SELECT call_view."location", count(*) AS count
FROM call_view
GROUP BY call_view."location";
CREATE OR REPLACE VIEW call_zustande AS
SELECT count(*) AS anzahl, call_view."location"
FROM call_view
WHERE call_view.dauer > 0
GROUP BY call_view."location";
Ich möchte eigentlich so gut wie alle Daten von oben mitnehmen, dass heißt ich brauche eigentlich eine Tabelle in der der “View” gemacht worden ist und zwar pro Eintrag einfach die Zeile “Destination” angefügt ist und dann wäre ich sorgenfrei.
Dann würde das alles super schnell laufen und ohne Probleme.
Daher wollte ich ja das mit den Triggern und Prozeduren machen, also mir einfach eine Prozedur bauen die sagt:
Wenn neue Daten eingetragen werden,
dann mache den “View “call_desti”” und schreibe mir das Ergebnis dieses Views in eine Zeile dahinter die Destination heißt.
so würden alle meine Felder mir zur Auswertung erhalten bleiben, und ich könnte vor allem das lästige “like” los werden, dass so lange braucht und nur noch mit
“Where =” arbeiten und Indexen.
So verstanden was ich meine? Ich möchte am Tag mehrere verschiedene auswertungen dieses Views machen, daher wäre mir eine ergänzte Tabelle lieber.
Gruß BoOnOdY