Announcement

Collapse
No announcement yet.

Kopfnuss: Join + Count + AVG in einer Abfrage...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kopfnuss: Join + Count + AVG in einer Abfrage...

    Hallo SQLer,

    habe ein Problem mit einer Abfrage und komme nicht weiter.

    folgende Tabellen liegen vor bzw ihr könnt diese ja mal in eine Test-Datenbank ausführen:

    CREATE TABLE kunde (
    kunden_id mediumint(8) unsigned NOT NULL auto_increment,
    sex enum('female','male','') NOT NULL,
    vorname varchar(50) NOT NULL,
    nachname varchar(50) NOT NULL,
    PRIMARY KEY (kunden_id)
    );

    INSERT INTO kunde VALUES (1, 'female', 'Tina', 'Müller');
    INSERT INTO kunde VALUES (2, 'male', 'Daniel', 'Krebs');
    INSERT INTO kunde VALUES (3, 'female', 'Kirsten', 'Schule');


    CREATE TABLE verkauf1 (
    verkauf_id mediumint(8) unsigned NOT NULL auto_increment,
    kunden_id mediumint(8) unsigned NOT NULL,
    verkaufs_betrag decimal(10,2) NOT NULL,
    verkaufs_datum datetime NOT NULL,
    PRIMARY KEY (verkauf_id)
    );

    INSERT INTO verkauf1 VALUES (1, 3, 14.40, '2009-04-02 11:37:06');
    INSERT INTO verkauf1 VALUES (2, 1, 28.30, '2009-05-14 11:37:18');
    INSERT INTO verkauf1 VALUES (3, 2, 34.40, '2009-05-06 11:38:14');
    INSERT INTO verkauf1 VALUES (4, 2, 25.60, '2009-05-07 11:38:39');


    CREATE TABLE verkauf2 (
    verkauf_id mediumint(8) unsigned NOT NULL auto_increment,
    kunden_id mediumint(8) unsigned NOT NULL,
    verkaufs_betrag decimal(10,2) NOT NULL,
    verkaufs_datum datetime NOT NULL,
    PRIMARY KEY (verkauf_id)
    );


    INSERT INTO verkauf2 VALUES (1, 2, 68.20, '2009-04-06 11:37:06');
    INSERT INTO verkauf2 VALUES (2, 3, 21.30, '2009-04-12 11:37:18');
    INSERT INTO verkauf2 VALUES (3, 3, 54.40, '2009-05-06 11:38:14');
    INSERT INTO verkauf2 VALUES (4, 1, 35.70, '2009-05-07 11:38:39');

    Nun zu meinem Dilemma:

    Aus einem Formular kommt nun ein Start- und ein Enddatum und daraus soll folgendes Ergebnis ausgeliefert werden:

    kunden_id, kunden_name, Anzahl Verkäufe aus verkauf1 und verkauf2, Datum des letzten Verkaufs

    Bsp:
    3 | Herr Dietmar Meier | 3 | 128,20 | 07.05.2007

    Ich weiß irgendwie nicht mehr weiter. Hab gerade nen Knoten in der grauen Masse in meinem Kopf. Bin über alle Ansätze / Lösungen sehr dankbar.

    Vielen Dank im Voraus und beste Grüße

    Picard

  • #2
    Moin, moin,

    wo liegt das Problem, an der gesamten Aufgabe?

    Startdatum und Enddatum wird aus Formular übergeben - Also Datum umwandeln in DB-Format und vergleichen mit

    PHP Code:
    verkaufs_datum >= $startdatum_formular AND verkaufs_datum <= $endatum_formular 
    Gruß Franz

    Comment


    • #3
      Originally posted by FraHa View Post
      Moin, moin,

      wo liegt das Problem, an der gesamten Aufgabe?

      Startdatum und Enddatum wird aus Formular übergeben - Also Datum umwandeln in DB-Format und vergleichen mit

      PHP Code:
      verkaufs_datum >= $startdatum_formular AND verkaufs_datum <= $endatum_formular 
      Gruß Franz
      Hi,

      Datum umwandeln usw ist kein Problem. Ich bekomme die Abfrage nicht so hin, wie ich sie gerne hätte. Das Ganze läuft ja über die beiden Verkauf-Tabellen und genau da hapert derzeit bei mir. Es sollen alle Kunden zwischen Anfangsdattum und Enddatum ausgegeben werden und soll wie hier im Beispiel aussehen:

      Ausgabe:
      kunden_id, kunden_name, Anzahl Verkäufe aus verkauf1 und verkauf2, Datum des letzten Verkaufs

      Bsp:
      3 | Herr Dietmar Meier | 3 | 128,20 | 07.05.2007



      Vielen Dank im Voraus

      Picard

      Comment


      • #4
        Originally posted by Picard View Post
        ...kunden_id, kunden_name, Anzahl Verkäufe aus verkauf1 und verkauf2, Datum des letzten Verkaufs

        Bsp:
        3 | Herr Dietmar Meier | 3 | 128,20 | 07.05.2007
        Hallo Picard,

        irgendwie passt das Beispiel nicht zur Aufgabenstellung! In der Aufgabe werden 4 Spalten gefordert, dein Bsp. enthält dagegen 5. Ich nehme mal an die 128,20 soll die Summe der verkaufs_betrag aus den Verkäufen sein.
        Auch gibt es in deinen Beispieldaten keinen Herrn Meier...

        Das Problem ist hier, dass du die Tabellen nicht einfach joinen kannst, da man davon ausgehen muß, dass es nicht immer in beiden Tabellen einen Eintrag für den gewählten Zeitraum gibt.
        Der einfachste Weg ist es, per UNION zuerst die beiden Verkaufstabellen zu verknüpfen und das Ergebnis mit den Kundendaten zu joinen.

        [highlight=sql]
        SELECT k.kunden_id, k.nachname,
        count( * ) "Anzahl Verkäufe aus verkauf1 und verkauf2",
        sum( v.verkaufs_betrag ) "Summe der Verkäufe aus verkauf1 und verkauf2",
        max( v.verkaufs_datum ) "Datum des letzten Verkaufs"
        FROM kunde k
        inner join (
        select kunden_id, verkaufs_betrag, verkaufs_datum
        from verkauf1
        union all
        select kunden_id, verkaufs_betrag, verkaufs_datum
        from verkauf2) v on v.kunden_id = k.kunden_id
        where v.verkaufs_datum BETWEEN :startdatum AND :enddatum
        GROUP BY k.kunden_id, k.nachname
        [/highlight]

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Besten Dank

          Originally posted by Falk Prüfer View Post
          irgendwie passt das Beispiel nicht zur Aufgabenstellung! In der Aufgabe werden 4 Spalten gefordert, dein Bsp. enthält dagegen 5. Ich nehme mal an die 128,20 soll die Summe der verkaufs_betrag aus den Verkäufen sein.
          Auch gibt es in deinen Beispieldaten keinen Herrn Meier...
          Hallo Falk,

          zunächst einmal vielen Dank für deine Hilfe. Deine Query gibt exakt das raus, was ich haben wollte. WOW
          Des Weiteren hast Du recht, die summe aus den Verkäufen habe ich im Beispiel vergessen .

          "Union" werde ich mir mal genauer anschauen. Hatte bisher damit nichts gemacht, habe aber heute ne menge dazu gelernt.

          Vielen Dank und beste Grüße

          Picard

          Comment

          Working...
          X