Hallo,
ich habe ein Problem in Oracle 8, bei dem ich mir eine View zusammenstellen möchte. Nachdem ich 3 Tage ohne brauchbares Ergebnis
herumgebastelt habe, wende ich mich nun entnervt an die absoluten Profis.
Das Problem lässt sich folgendermaßen beschreiben:
Tabelle1
Kunde
Hausanschlussnr.
Ort
usw.
Tabelle2
Hausanschlussnr.
Zaehlernummer
Datum
Stand
Wobei in Tabelle1 jeder Kunde n ID Sätze haben kann. Über die ID werden die Tabellen verbunden.
In Tabelle2 können zu jeder ID 1-n Zähler und für jeden Zähler 1-n Stände existieren.
So, jetzt kommt’s :
Ich benötige zu jedem Kunden seine Zähler und zu jedem Zähler den Stand zum JÜNGSTEN Datum.
Immerhin: das Datum ist eindeutig.
Bisher behelfe ich mir mit folgendem Kommando (verkürzt), dass ich allerdings nicht als View
verwenden kann (zumindest wüsste ich nicht wie).
Leider geht meine gesamte Strukturierung verloren:
CURSOR cKunden IS
SELECT ALL
H.KUND_KUNDEN_NR, H.KUND_NAME1,
H.KUND_NAME2, H.ORT_O_NAME,
H.STRA_ST_NAME, H.HAUS_ZUSATZHAUSNUMMER,
H.HAUS_HAUSNUMMER, Z.INDART_NUMMER1,
Z.INDART_NUMMER, Z.ZSTAND_ZAEHLERSTAND,
TO_CHAR(Z.ZSTAND_DATUM,‚YYYY-MM-DD‘) ZDATUM,
TO_CHAR(Z.ZSTAND_ERFASSUNGSTAG,‚YYYY-MM-DD‘) EDATUM,
H.HAUS_WOHNUNGSNUMMER
FROM VADA_ZAEHLERSTAENDE Z, HAUSANSCHLUESSE_KUNDEN H
WHERE H.KUND_KUNDE_STILLGELEGT_AM IS NULL
AND (Z.INDART_AKTUELL_IN_HAUSANSCHL=H.HAUS_HAUSANSCHLUSSNUMMER)
ORDER BY H.KUND_KUNDEN_NR, Z.INDART_NUMMER, Z.ZSTAND_DATUM;
BEGIN
FOR c1 in cKunden LOOP
R_COUNT := R_COUNT + 1;
IF ((c1.KUND_KUNDEN_NR != S_KDNR) OR
(c1.INDART_NUMMER != S_SZNR)) AND
(R_COUNT > 1)
THEN
INSERT INTO t_luen_webze
(T_KDNR, T_NAME1, T_NAME2, T_ORT, T_STRASSE,
T_HSNR, T_ZHSNR, T_WOHNNR, T_PZNR, T_SZNR,
T_ZDATUM, T_ZSTAND, T_ZDATUM1)
VALUES
(S_KDNR, S_NAME1, S_NAME2, S_ORT, S_STRASSE,
S_HSNR, S_ZHSNR, S_WOHNNR, S_PZNR, S_SZNR,
S_ZDATUM, S_ZSTAND, S_ZDATUM1);
END IF;
S_KDNR := c1.KUND_KUNDEN_NR;
S_NAME1 := c1.KUND_NAME1;
S_NAME2 := c1.KUND_NAME2;
S_ORT := c1.ORT_O_NAME;
S_STRASSE := c1.STRA_ST_NAME;
S_HSNR := c1.HAUS_HAUSNUMMER;
S_ZHSNR := c1.HAUS_ZUSATZHAUSNUMMER;
S_WOHNNR := c1.HAUS_WOHNUNGSNUMMER;
S_PZNR := c1.INDART_NUMMER1;
S_SZNR := c1.INDART_NUMMER;
S_ZSTAND := c1.ZSTAND_ZAEHLERSTAND;
S_ZDATUM := c1.ZDATUM;
S_ZDATUM1 := c1.EDATUM;
END LOOP;
INSERT INTO t_luen_webze
(T_KDNR, T_NAME1, T_NAME2, T_ORT, T_STRASSE, T_HSNR, T_ZHSNR,
T_WOHNNR, T_PZNR, T_SZNR, T_ZDATUM, T_ZSTAND, T_ZDATUM1)
VALUES
(S_KDNR, S_NAME1, S_NAME2, S_ORT, S_STRASSE, S_HSNR, S_ZHSNR,
S_WOHNNR, S_PZNR, S_SZNR, S_ZDATUM, S_ZSTAND, S_ZDATUM1);
END;
/
Der folgende Select ist zwar ein guter Ansatz, scheitert aber daran, dass ich die Zählerstände in die GROUP BY Klausel aufnehmen müsste, was aber wieder zu zu vielen Zeilen (alle Daten/Zählerstände) pro Kunde/Zähler führt.
SELECT
HAUSANSCHLUESSE_KUNDEN.KUND_KUNDEN_NR, HAUSANSCHLUESSE_KUNDEN.KUND_NAME1,
HAUSANSCHLUESSE_KUNDEN.KUND_NAME2, HAUSANSCHLUESSE_KUNDEN.ORT_O_NAME,
HAUSANSCHLUESSE_KUNDEN.STRA_ST_NAME, HAUSANSCHLUESSE_KUNDEN.HAUS_HAUSNUMMER,
HAUSANSCHLUESSE_KUNDEN.HAUS_ZUSATZHAUSNUMMER, HAUSANSCHLUESSE_KUNDEN.HAUS_WOHNUNGSNUMMER,
VADA_ZAEHLERSTAENDE.INDART_NUMMER1, VADA_ZAEHLERSTAENDE.INDART_NUMMER,
MAX(VADA_ZAEHLERSTAENDE.ZSTAND_DATUM),
VADA_ZAEHLERSTAENDE.ZSTAND_ZAEHLERSTAND,
MAX(VADA_ZAEHLERSTAENDE.ZSTAND_ERFASSUNGSTAG)
FROM VADA_ZAEHLERSTAENDE, HAUSANSCHLUESSE_KUNDEN
WHERE HAUSANSCHLUESSE_KUNDEN.KUND_KUNDE_STILLGELEGT_AM IS NULL
AND (VADA_ZAEHLERSTAENDE.INDART_AKTUELL_IN_HAUSANSCHL=HAUSANSCHLUESSE_KUNDEN.HAUS_HAUSANSCHLUSSNUMMER)
GROUP BY
HAUSANSCHLUESSE_KUNDEN.KUND_KUNDEN_NR, HAUSANSCHLUESSE_KUNDEN.KUND_NAME1,
HAUSANSCHLUESSE_KUNDEN.KUND_NAME2, HAUSANSCHLUESSE_KUNDEN.ORT_O_NAME,
HAUSANSCHLUESSE_KUNDEN.STRA_ST_NAME, HAUSANSCHLUESSE_KUNDEN.HAUS_ZUSATZHAUSNUMMER,
HAUSANSCHLUESSE_KUNDEN.HAUS_HAUSNUMMER, HAUSANSCHLUESSE_KUNDEN.HAUS_WOHNUNGSNUMMER,
VADA_ZAEHLERSTAENDE.INDART_NUMMER1,
VADA_ZAEHLERSTAENDE.INDART_NUMMER
Zugegeben, es dürfte sich hierbei um eine Sache für Profis handeln.
Bin gespannt ob mir jemand helfen kann.
MfG,
Sven