Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 9 von 9
  1. #1
    Neuer Benutzer
    Registriert seit
    14.02.2016
    Beiträge
    6

    Standard verschiedene Datenbankfelder zu einer Abfrage

    Hallo an alle,

    ich habe folgende Datenbankstruktur (Auszug) - an der ich leider nichts ändern kann.

    Abt1_Monat Abt1_Jahr Abt1_Wert Abt2_Monat Abt2_Jahr Abt2_Wert
    01 16 200,00 02 16 300,00
    02 16 400,00
    02 16 600,00 01 16 700,00



    Ich möchte folgendes Ergebnis haben:

    Monat(Abt1 und 2) Jahr (Abt1 und 2) SummeAbt1 SummeAbt2
    01 16 200 700
    02 16 1000 300

    Ich habe eine sum (case when) probiert, erhalte aber immer die Monate getrennt.

    Hat jemand eine Idee? Firebird ist die 2.5.

    VG

    Ronin269

  2. #2
    Neuer Benutzer
    Registriert seit
    14.02.2016
    Beiträge
    6

    Standard

    Bitte in Firebird verschieben, falsches Unterforum angeklickt.

  3. #3
    Stammgast
    Registriert seit
    21.09.2010
    Beiträge
    119

    Standard

    Wie wäre es mit diesem Lösungsansatz? Sollte denke ich auch bei Firebird funktionieren.

    Code SQL:
    SELECT monat, jahr, SUM(wert) AS wert
      FROM (SELECT t.abt1_monat AS monat,
                   t.abt1_jahr AS jahr,
                   SUM(t.abt1_wert) AS wert
              FROM tabelle t
             GROUP BY t.abt1_monat, t.abt1_jahr
            UNION ALL
            SELECT t.abt2_monat AS monat,
                   t.abt2_jahr AS jahr,
                   SUM(t.abt2_wert) AS wert
              FROM tabelle t
             GROUP BY t.abt2_monat, t.abt2_jahr)
     GROUP BY monat, jahr

  4. #4
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.803

    Standard

    Mach jeweils eine Abfrage nur für die Summe von Abt1 bzw. Abt2 (jeweils Monat, Jahr, Summe). Diese beiden Subabfragen joinst du dann über Monat/Jahr zu einer. Da würde ein FULL OUTER JOIN helfen. Glaube aber nicht das Firebird den kennt.

    Ohne Full Outer Join würde eine weitere Tabelle die nur die Monate+Jahr (egal ob nur tempörär oder tatsächlich) darstellt helfen. Dann würdest du auch dann einen Datensatz für einen Monat bekommen wenn es weder für Abt1&Abt2 in diesem Monat Daten gibt. Ohne Details über dein konkretes Problem ist das eh meistens das was man will.

  5. #5
    Stammgast
    Registriert seit
    21.09.2010
    Beiträge
    119

    Standard

    Habe jetzt erst gesehen, dass die Werte in zwei verschiedenen Spalten stehen sollen.
    Dann vielleicht so?

    Code SQL:
    SELECT monat, jahr, SUM(wert1) AS wert1, SUM(wert2) AS wert2
      FROM (SELECT t.abt1_monat AS monat,
                   t.abt1_jahr AS jahr,
                   SUM(t.abt1_wert) AS wert1,
                   SUM(0) AS wert2
              FROM /*tabelle t*/ (SELECT '01' AS abt1_monat,
                          '16' AS abt1_jahr,
                          200 AS abt1_wert,
                          '02' AS abt2_monat,
                          '16' AS abt2_jahr,
                          300 AS abt2_wert
                     FROM dual
                   UNION ALL
                   SELECT '02' AS abt1_monat,
                          '16' AS abt1_jahr,
                          400 AS abt1_wert,
                          NULL AS abt2_monat,
                          NULL AS abt2_jahr,
                          NULL AS abt2_wert
                     FROM dual
                   UNION ALL
                   SELECT '02' AS abt1_monat,
                          '16' AS abt1_jahr,
                          600 AS abt1_wert,
                          '01' AS abt2_monat,
                          '16' AS abt2_jahr,
                          700 AS abt2_wert
                     FROM dual) t
             GROUP BY t.abt1_monat, t.abt1_jahr
            UNION ALL
            SELECT t.abt2_monat AS monat,
                   t.abt2_jahr AS jahr,
                   SUM(0) AS wert1,
                   SUM(t.abt2_wert) AS wert2
              FROM /*tabelle t*/ (SELECT '01' AS abt1_monat,
                          '16' AS abt1_jahr,
                          200 AS abt1_wert,
                          '02' AS abt2_monat,
                          '16' AS abt2_jahr,
                          300 AS abt2_wert
                     FROM dual
                   UNION ALL
                   SELECT '02' AS abt1_monat,
                          '16' AS abt1_jahr,
                          400 AS abt1_wert,
                          NULL AS abt2_monat,
                          NULL AS abt2_jahr,
                          NULL AS abt2_wert
                     FROM dual
                   UNION ALL
                   SELECT '02' AS abt1_monat,
                          '16' AS abt1_jahr,
                          600 AS abt1_wert,
                          '01' AS abt2_monat,
                          '16' AS abt2_jahr,
                          700 AS abt2_wert
                     FROM dual) t
             GROUP BY t.abt2_monat, t.abt2_jahr)
     WHERE monat IS NOT NULL
       AND jahr IS NOT NULL
     GROUP BY monat, jahr

    Und ohne dual (Oracle spezifisch), bitte tabelle ersetzen.

    Code SQL:
    SELECT monat, jahr, SUM(wert1) AS wert1, SUM(wert2) AS wert2
      FROM (SELECT t.abt1_monat AS monat,
                   t.abt1_jahr AS jahr,
                   SUM(t.abt1_wert) AS wert1,
                   SUM(0) AS wert2
              FROM tabelle t
             GROUP BY t.abt1_monat, t.abt1_jahr
            UNION ALL
            SELECT t.abt2_monat AS monat,
                   t.abt2_jahr AS jahr,
                   SUM(0) AS wert1,
                   SUM(t.abt2_wert) AS wert2
              FROM tabelle t
             GROUP BY t.abt2_monat, t.abt2_jahr)
     WHERE monat IS NOT NULL
       AND jahr IS NOT NULL
     GROUP BY monat, jahr

  6. #6
    Neuer Benutzer
    Registriert seit
    14.02.2016
    Beiträge
    6

    Standard

    Vielen Dank für Eure Hilfe!

    Das wird viel zu aufwendig. Dann werde ich doch die Sache mit einer Schleife in php lösen. Ich dachte, ich könnte die langsame Schleife von php relativ simpel umgehen. Es sollen ja Werte für alle 12 Monate + mehrere Jahre abgefragt werden.

    Trotzdem Danke!
    Geändert von ronin269 (10.10.2016 um 14:07 Uhr)

  7. #7
    Stammgast
    Registriert seit
    21.09.2010
    Beiträge
    119

    Standard

    Hat mein SQL nicht das gewünschte Ergebnis geliefert?

    Code SQL:
    SELECT monat, jahr, SUM(wert1) AS wert1, SUM(wert2) AS wert2
      FROM (SELECT t.abt1_monat AS monat,
                   t.abt1_jahr AS jahr,
                   SUM(t.abt1_wert) AS wert1,
                   SUM(0) AS wert2
              FROM tabelle t
             GROUP BY t.abt1_monat, t.abt1_jahr
            UNION ALL
            SELECT t.abt2_monat AS monat,
                   t.abt2_jahr AS jahr,
                   SUM(0) AS wert1,
                   SUM(t.abt2_wert) AS wert2
              FROM tabelle t
             GROUP BY t.abt2_monat, t.abt2_jahr)
     WHERE monat IS NOT NULL
       AND jahr IS NOT NULL
     GROUP BY monat, jahr

  8. #8
    Neuer Benutzer
    Registriert seit
    14.02.2016
    Beiträge
    6

    Standard

    Danke FlexGer, doch, hatte ich erst später gelesen.



    es klappt wunderbar mit:
    Code SQL:
    SELECT monat, jahr, SUM(wert1) AS wert1, SUM(wert2) AS wert2
      FROM (SELECT t.abt1_monat AS monat,
                   t.abt1_jahr AS jahr,
                   SUM(t.abt1_wert) AS wert1,
                   SUM(0) AS wert2
              FROM tabelle t
             GROUP BY t.abt1_monat, t.abt1_jahr
            UNION ALL
            SELECT t.abt2_monat AS monat,
                   t.abt2_jahr AS jahr,
                   SUM(0) AS wert1,
                   SUM(t.abt2_wert) AS wert2
              FROM tabelle t
             GROUP BY t.abt2_monat, t.abt2_jahr)
     WHERE monat IS NOT NULL
       AND jahr IS NOT NULL
     GROUP BY monat, jahr

    perfekt!

    Vielen Dank, geht superschnell!!!
    Geändert von ronin269 (10.10.2016 um 14:26 Uhr)

  9. #9
    Stammgast
    Registriert seit
    21.09.2010
    Beiträge
    119

    Standard

    Ok freut mich

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •