Queries Zusammenfügen

Light-Pix

Neuer Benutzer
Beiträge
3
Hallo liebes Forum :)


Ich habe folgende View, die aus einer größeren Tabelle aus Handelsgeschäften (trades) erzeugt wird. Sie stellt eine Zusammenfassung aller Geschäfte mit dem Handelspartner dar:
Code:
CREATE OR REPLACE VIEW v_report AS
SELECT partner, SUM( upl ) AS 'upl', SUM( diff_upl ) AS 'diff_upl'
FROM trades
WHERE datum > '2012-04-01'
GROUP BY partner

view.jpg

und folgendes Query, welches fehlerhafte Geschäfte in der großen trade-Tabelle ausfindig macht und deren upl (Handelswert) ausweist:
Code:
SELECT t2.upl, t1.upl
FROM trades t1, trades t2
WHERE t1.datum > '2012-04-01'
AND t1.trd_id = t2.trd_id_vortag
AND t2.upl =0

upl.jpg

Was nun passieren soll ist, dass beim Erzeugen der View v_report alle fehlerhaften Geschäfte den Wert in upl korrigiert auf die diff_upl addiert bekommen sollen.
Dazu müsste ich ja irgendwie das zweite Query in das Erste integrieren, aber da komme ich auf keinen grünen Zweig, leider :(

Daher hoffe ich sehr auf eure Hilfe und bedanke mich schonmal ganz herzlich im Voraus :)
Falls etwas nich ganz verstanden worden ist, so fragt bitte nach.
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
Hy,

müsste mit einer sogenannten "INLINE-VIEW" gehen.

Code:
[FONT=Consolas]CREATE OR REPLACE VIEW v_report AS
SELECT tr.partner, SUM( tr.upl ) AS 'upl', ( SUM( tr.diff_upl ) + tbkorrekt.upl_korrigiert ) AS 'diff_upl'[/FONT]
[FONT=Consolas]
FROM trades tr
,(SELECT t2.upl, t1.upl as upl_korrigiert, t1.partner FROM trades t1, trades t2 WHERE t1.datum > '2012-04-01' AND t1.trd_id = t2.trd_id_vortag AND t2.upl = 0)tbkorrekt[/FONT]
[FONT=Consolas]WHERE tbkorrekt.partner = tr.partner
AND tr.datum > '2012-04-01'GROUP BY tr.partner[/FONT]

Lg
 

ukulele

Datenbank-Guru
Beiträge
4.582
Ich versteh diese Korrektur Abfrage nicht so ganz, muss ich aber eigentlich auch gar nicht. Ich würde dir raten, aus dem Korrektur Query erstmal eine Sicht zu machen in der eine ID oder zur Not auch der Partnername steht und alle Korrekturwerte.

Diese kannst du dann in deiner Hauptsicht per LEFT JOIN verknüpfen um dann im SELECT Teil mit einer CASE Schleife den ggf. vorhandenen Korrekturwert einzuarbeiten (eventuell reicht auch addieren). Nur die Fehlerhaften Datensätze müsstest du vorher mal in einer Sicht ausgeben, sonst wird der JOIN schwer.

PS: Sofern das oben nicht klappt, ich war auch an dem Punkt aber zu verwirrt :)
 

Light-Pix

Neuer Benutzer
Beiträge
3
Hi,

@PLSQL_SQL: leider kommt bei mir immer folgender Fehler, wenn ich den Query ausführe:
Code:
#1349 - View's SELECT contains a subquery in the FROM clause
Kann's sein, dass Inline-Views nicht unterstützt werden, von phpmyadmin?

@ukulele: Ich schaue mal, was sich machen lässt. Danke für den Ansatz.
 

PLSQL_SQL

SQL-Guru
Beiträge
176
Hy,

@Light-Pix: ja das kann sein, weiß ich aber leider nicht.

@ukulele: Eine INLINE-VIEW verhindert nur, dass du nicht (wie von dir vorgeschlagen) explizit eine Abfrage
als VIEW in der DB speichern musst, wenn du diese nur einmal benötigst.

z.B.:

Du hast eine Tabelle Personen und eine Tabelle Adresse.

Tabelle Personen: PERSON_NR, VORNAME, NACHNAME
Tabelle Adressen: ADR_NR, PERSON_NR, STRASSE, PLZ, ORT


Nun könntest du eine Abfrage Adressen machen und als VIEW speichern.

Code:
create view adressen_v
as
select * from adressen

Und anschließend folgendes Stmt ausführen:

Code:
Select p.*, a.*
from personen p
        ,adressen_v a
where p.person_nr = a.person_nr


Aber dies kann auch beides in einem Stmt erledigt werden:

Code:
Select p.*, a.*
from personen p
        ,(Select * from adressen)a         <----- INLINE - VIEW (d.h. SQL-CODE muss nicht als VIEW in der DB gespeichert werden, um diesen zu JOINEN)
where p.person_nr = a.person_nr

LG
 
Werbung:

Light-Pix

Neuer Benutzer
Beiträge
3
So, ich hab's raus. Hier sind die zwei Querys 1. zum Korrigieren der upl und 2. zum Erzeugen der View, mit Hilfe einer Zweiten :) Danke euch für eure Hilfe!

Code:
CREATE OR REPLACE VIEW v_uplkorrektur AS
SELECT DISTINCT cd.trd_id, CASE WHEN (pd.trd_id = cd.trd_id_vortag AND cd.upl = 0) THEN pd.upl ELSE 0 END AS 'upl_korrigiert'
FROM trades pd, trades cd
WHERE pd.datum > '2012-04-01'
AND pd.partner = cd.partner
AND NOT (cd.upl = cd.diff_upl AND NOT cd.trd_id_vortag = pd.trd_id)
 
 
 
CREATE OR REPLACE VIEW v_report AS
SELECT t.partner, SUM( t.upl ) AS 'upl', SUM( t.diff_upl ) + SUM(v.upl_korrigiert) AS 'diff_upl'
FROM trades t
LEFT JOIN v_uplkorrektur v ON t.trd_id = v.trd_id
WHERE t.datum > '2012-04-01'
GROUP BY t.partner, v.partner
 
Oben