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

Mehrere Abfragen durch zusätzliche Spalten verbinden

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Orangensaft, 3 Oktober 2016.

  1. Orangensaft

    Orangensaft Benutzer

    Hallo werte Community,
    vorweg, ich bin ein SQL Neuling, allerdings mit anderen Programmiersprachen mehr oder weniger vertraut.

    Problemstellung: Es soll eine Liste an Personen ausgegeben werden, welche eine bestimmte Bedingung erfüllen. Zusätzlich besitzen diese Personen Buchungen, welche in verschiedenen Jahren getätigt wurden. Nun will ich von diesen Personen die Daten sowie die Buchungen im Jahr 2013, 2014, 2015, 2016, jeweils in einer eigenen Spalte ausgeben. Es sollte alles mehr oder weniger eine Abfrage sein, damit im Anschluss schnell und einfach ein Bericht (JasperReport) erstellt werden kann.

    Im Moment habe ich das ganze über zwei einzelne Abfragen gelöst. Nun hätte ich gerne das die Spalte Betrag1Jahr oben neben dem Gesamtbetrag angezeigt wird. Dabei will ich keine Doppelten Einträge (Ansatz mit UNION lieferte mir Namen doppelt), aber trotzdem ein Eintrag auch wenn vielleicht in einem Jahr keine Buchung vorhanden war.
    upload_2016-10-3_17-0-41.png

    Ich hoffe man versteht mein Problem :) Ansonsten gebe ich gerne weitere Erläuterungen!

    Anbei noch die zwei Abfragen wie Sie im Moment verwendet werden

    Code:
    SELECT person_nr AS PersonenNummer,
    CONCAT (name, name2 ) AS Name,
    SUM(buchung.betrag_ein - buchung.betrag_aus) AS Gesamtbetrag
    FROM buchung
    INNER JOIN person ON buchung.person_id = person.id
    WHERE
    sperr_grund_id IN ('21', '22', '23', '17', '10', '2')
    GROUP BY person_nr, CONCAT (name, name2 )
    
    
    SELECT person_nr AS PersonenNummer,
    CONCAT (name, name2 ) AS Name,
    SUM(buchung.betrag_ein - buchung.betrag_aus) AS Betrag1Jahr
    FROM buchung
    INNER JOIN person ON buchung.person_id = person.id
    WHERE sperr_grund_id IN ('21', '22', '23', '17', '10', '2') AND
    (YEAR(CAST(buchungs_datum AS DATE)) = 2015 OR YEAR(CAST(buchungs_datum AS DATE)) = 2016)
    GROUP BY person_nr, CONCAT (name, name2 )
    
    Herzlichen Dank,
    Orangensaft
     
  2. akretschmer

    akretschmer Datenbank-Guru

    soweit ich das sehe könntest Du das via sum(case when ... then ... else 0 end) regeln. Passend erweitern ;-)

    Deine Datentypen scheinen für den Eimer zu sein, wenn Du im WHERE so schlimm rumCASTen mußt. Die Performance dürfte daher schnell unterirdisch sein.
     
    Orangensaft gefällt das.
  3. Orangensaft

    Orangensaft Benutzer

    Ausgezeichnet!

    Genau sowas habe ich gesucht, vielen Dank.

    Performance ist nicht relevant, die Abfrage wird vlt. 1 mal im Monat ausgeführt und auch dann ist die Geschwindigkeit relativ egal :)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Dann bist Du eine seltene Ausnahme ;-)
     
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