Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Queries Zusammenfügen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Light-Pix, 8 Mai 2012.

  1. Light-Pix

    Light-Pix Neuer Benutzer

    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.
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
    Charly gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    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 :)
     
  4. Light-Pix

    Light-Pix Neuer Benutzer

    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.
     
  5. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    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
     
  6. Light-Pix

    Light-Pix Neuer Benutzer

    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
    
     
    ukulele und PLSQL_SQL gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden