1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Ist es möglich Ergebnisse als Namen von Spalten zum Speichern von aggregierten Werten zu verwenden?

Dieses Thema im Forum "FileMaker" wurde erstellt von gczychi, 11 Mai 2015.

  1. gczychi

    gczychi Neuer Benutzer

    Ist es möglich das Ergebnis einer Abfrage als Column-Namen für das Speichern von aggregierten Werten in eine zweite Tabelle zu verwenden? (SQL-92)

    Hallo,
    ich habe zwei Tabellen, wie folgt:

    Tabelle 1 "Buchung":

    id Konto Betrag
    1 555 2.90
    2 123 100
    3 900 -25.25
    4 555 140
    5 123 33
    6 123 10000​

    Tabelle 2 "Erfolg":
    id Sum100 … Sum123 … Sum380 … Sum555 … Sum900 … Sum999 … Zeitraum​


    Es geht darum, alle Beträge der einzelnen, vorhandenen Konten in "Buchung" zu addieren, z.B. so:
    Code:
    SELECT Konto, SUM(Betrag) FROM Buchung GROUP BY Konto
    Ich erhalte folgendes:

    Konto,SUM(Betrag)
    123,10133
    555,142.9
    900,-25.25​

    Diese aggregierten Werte müssen jetzt in eine Zeile (!) von "Erfolg" geschrieben werden, z.B. so:
    Code:
    INSERT INTO Erfolg (Sum123, Sum555, Sum900) Values (10133, 142.9, -25.25)
    oder, wenn es den Datensatz bereits gibt, in denen die Werte geschrieben werden:
    Code:
    INSERT INTO Erfolg (Sum123, Sum555, Sum900) Values (10133, 142.9, -25.25) WHERE Zeitraum = 2015.55
    Die Frage ist: Wie kann ich das mit einem Query machen? Und zwar so, dass ich nicht alle möglichen "Konto"s auflisten muss, sondern nur die jeweils vorhandenen Kontobeträge von "Buchung" in "Erfolg" schreibe. Also nicht so:
    Code:
       SELECT
         SUM ( CASE Konto WHEN 100 THEN Betrag END) AS Sum100,
         …
         SUM ( CASE Konto WHEN 123 THEN Betrag END) AS Sum123,
         …
         SUM ( CASE Konto WHEN 380 THEN Betrag END) AS Sum380
         …
       FROM Buchung
    Zusätzliche Infos: Es gibt insgesamt etwa 70 mögliche Werte für Konto/SumNNN, von denen jedoch bei jeder Abfrage nur jeweils etwa 20 in "Buchung" vorhanden sind. Bei jedem Abfragezeitpunkt ändern sich die Kontos und auch deren Anzahl und natürlich die Anzahl und Werte der einzelnen Beträge. Ich muss diese Werte beliebig oft für beliebig viele Zeitraume in "Erfolg" speichern.
    Ach ja, mein SQL ist von FileMaker und ist: "SQL-92 entry- level conformance, with some SQL-92 intermediate features". So etwas wie PIVOT gibt es leider nicht.
    Vielen Dank für jeden Hinweis!

    Gary
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Nein.

    Was Du evtl. machen kannst: das SQL dazu dynamisch zusammenbauen. Wenn die DB z.B. stored Procs kann, dann evtl. damit. In PG könnt ich dir das aus dem Ärmel schütteln.

    Was Du machen solltest: das DB-Design überdenken. Ich halte das so für grob falsch.
     
  3. gczychi

    gczychi Neuer Benutzer

    Hatte es fast befürchtet; beides. ;-) Die Tabellen existieren schon lange und da ran zu gehen wäre zuviel Aufwand.
    Ich kann den zweiten query auch dynamisch generieren, hatte jedoch auf eine elegante Lösung gehofft.

    Gibt es wirklich keine Möglichkeit die Feldnamen für die zweite Tabelle zu generieren? Z.B. mit Concat oder so (kenn mich mit SQL nicht so gut aus)?
     
    Zuletzt von einem Moderator bearbeitet: 11 Mai 2015
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, mit Stringoperationen etc. Damit einen SQL zusammenfrickeln, der das auszuführende SQL enthält, das dann ausführen. Doku für PostgreSQL:
    http://www.postgresql.org/docs/9.4/...tements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
     

Diese Seite empfehlen