mySQL 5.1 - Abfragen verbinden, Verbindungselement nicht in beiden Abfragen enthalten

haugustin

Grünschnabel
Guten Morgen,

sorry, der Fragetitel ist glaub ich nicht optimal, aber ich kann es nicht anders oder kürzer ausdrücken.

Hoffentlich wird es mit der Erklärung verständlicher:

Meine Daten kommen aus einem mySQL 5.1.50 Server, das Datenmodell ist ein fremdes, darauf habe ich keinen Einfluss.
Ich habe im Moment 2 Abfragen die Kundendaten selektieren.
Mit Group und bedingten Summierungen bekomme ich dort schnell und präzise die gewünschten Informationen.
Nun stelle ich es etwas vereinfacht dar, es geht mir vor allem darum das Prinzip der möglichen Lösung zu verstehen:

1. Kunde, offeneOP_Älter30Tage, offeneOP_Jünger30Tage
2. Kunde, offeneAufträge_Älter30Tage, offeneAufträge_Jünger30Tage

Nun ist es ja so, nicht jeder Kunde hat OPs und nicht jeder Kunde hat Aufträge.

Also,
1. Aufgabe: In der Ergebnismenge sollen alle Kunden auftauchen mit mind. 1 OP oder mind. 1 Auftrag.
2. Aufgabe: Die beiden Kundennummernfeldern sollen im Endergebnis nur in einer Spalte stehen, unabhängig von der Herkunft.
2. Aufgabe: die beiden Abfragen sollen zu einer zusammengefasst werden, so dass ich erhalten:
Kunde, offeneOP_Älter30Tage, offeneOP_Jünger30Tage, offeneAufträge_Älter30Tage, offeneAufträge_Jünger30Tage

Natürlich werden die Spalten als NULL ausgegeben bei denen Kunden z. B. keine Aufträge haben.

Ich hoffe nun das ist verständlich und ich habe mit meinem ersten Post keine Regeln verletzt oder wichtige Informationen zurückgehalten.

Viele Grüße,
haugustin
 
Willkommen.
Das nenn ich jetzt mal ausführliche Problembeschreibung. Damit verletzt man sicher keine Regeln (Ansonsten gibts immer noch der Willkommensbonus *g*)

Aber eine Gegenfrage habe ich noch. Diese 2 Zusammenstellungen. Kommen die aus derselben Quelle oder sind es verschiedene Tabellen?


A1/A2: Auflistung aller Kunden die irgendwo vorkommen
SQL:
SELECT kunde
FROM tbl_op
UNION
SELECT kunde
FROM tbl_auftraege

A3:
SQL:
SELECT
    k.kunde
    o.offeneOP_Älter30Tage, 
    o.offeneOP_Jünger30Tage,
    a.offeneAufträge_Älter30Tage, 
    a.offeneAufträge_Jünger30Tag
FROM
    (
        SELECT kunde
        FROM tbl_op
        UNION
        SELECT kunde
        FROM tbl_auftraege
    ) AS k
    LEFT JOIN tbl_op    AS o
        ON k.kunde = o.kunde
    LEFT JOIN tbl_auftraege AS a
        ON k.kunde = a.kunde
 
Zuletzt bearbeitet von einem Moderator:
Zunächst mal danke für die Blumen.
Beim durchlesen hätte ich darauf kommen können, dass ich 2 x Aufgabe 2 habe! :D

Zu deiner Frage: die Herkunft ist unterschiedlich.
Die OPs kommen aus einer Tabelle des Systems.
Die ABs kommen aus einer View die ich schon mal vorbereitet hatte da die Tabellen des Systems nicht soooo optimal für meine Vorhaben sind.

Deine Ansätze sehen schon mal gut aus, das setze ich mal um, melde mich dann.

DANKE
 
OK, ich habe das auf meine Daten angewendet und das Konstrukt um weitere Tabellen/Abfragen und Felder erweitert. Es war ja eine stark vereinfachte Darstellung.
Es sieht sehr sehr gut aus.
Soweit 1000 Dank.

Falls ich es richtig sehe habe ich auch verstanden wie es funktioniert.

Es ergeben sich für mich noch Fragen:

1. Der Teil, der die Kunden als Gesamtliste erzeugt (k) ist ja ein simples UNION. Soweit war ich auch schon. ... zwischenzeitlich mySQL Doku gelesen...
OK, also UNION macht im Standard ohne weitere Angaben DISTINCT. Das ist gut, das war meine Frage.
Wenn es dazu nichts mehr zu sagen gibt: Selbst beantwortet! :-D

2. Ich beziehe mich weiterhin auf die vereinfachten Variante meiner Ursprungsfrage: Im Moment habe ich das Konstrukt so gehalten, dass ich die beiden Abfragen auf OP und AB als Views gepeichert sind und das Konstrukt die beiden Views abfragt.

Wie gehe ich vor, wenn ich das alles auf einen Rutsch in einem Code schreiben wollte?

Nochmals vielen Dank, diese Hilfe war sehr sehr gut!
 
1) Jepp

2) Ist nicht so lustig. Du kannst die Quellen durch Subqueries ersetzen. Da du aber jedes Source 2 mal drin hast (im UNION und im JOIN) wird das unschön.
Du kannst aber das Resultat auch anderst herholen, dann hast due jede Quelle nur einmal drin

SQL:
SELECT
    dat.kunde,
    SUM(dat.offeneOP_Älter30Tage)           AS offeneOP_Älter30Tage, 
    SUM(dat.offeneOP_Jünger30Tage)          AS offeneOP_Jünger30Tage,
    SUM(dat.offeneAufträge_Älter30Tage)     AS offeneAufträge_Älter30Tage,
    SUM(dat.offeneAufträge_Jünger30Tag)     AS offeneAufträge_Jünger30Tag
FROM
    (
        SELECT 
            o.kunde,
            o.offeneOP_Älter30Tage, 
            o.offeneOP_Jünger30Tage,
            0 AS offeneAufträge_Älter30Tage,
            0 AS offeneAufträge_Jünger30Tag
        FROM 
            (
                SELECT ....
                -- Dein SQL für op
            ) AS o
        UNION ALL
        SELECT 
            a.kunde,
            0 AS offeneOP_Älter30Tage, 
            0 AS offeneOP_Jünger30Tage,
            a.offeneAufträge_Älter30Tage,
            a.offeneAufträge_Jünger30Tag
        FROM
            (
                SELECT ....
                -- Dein SQL für aufträge
            ) AS a
    ) AS dat
GROUP BY
 
Zuletzt bearbeitet von einem Moderator:
Ok, danke schon wieder!

Ich werde schauen was besser ist.

Jetzt kommts aber gerade ganz dicke.
Ich wollte das Ergebnis als View speichern damit ich es immer schön per ODBC in Excel aktualisieren kann.

Leider stoße ich dabei auf eine Beschränkung von mySQL keine Views mit subquerys im FROM anlegen zu können.

Da bin ich bestimmt nicht der Erste, ich google mal los. Vielleicht hat aber hier einer einen guten, bewährten Trick.

Danke.
 
Ich arbeite eigentlich nie mit Views. Ev. musst da das ganze dann in einzelen Views splitten?
 
Ja, so gings.
Eigentlich "nur" die Zusammenfassung der Kundennummer in ne View und dann die eingebunden.

Thema erledigt, danke danke danke!
 
Zurück