[MySQL] SUM über verschiedene Spalten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL] SUM über verschiedene Spalten

    Hallo zusammen. Nach langer Zeit melde ich mich mal wieder hier, bisher hat mir immer Lesen und Suchen zur Problemlösung ausgereicht, diesemal komme ich jedoch irgendwie nicht weiter. Kurz gesagt: ich steh aufm Schlauch.

    Also folgendes, ich habe 3 Tabellen:

    Tabelle 1: Bausteine
    In dieser steht der Name und ein Code eines Bausteins (natürlich noch mehr, aber für das Beispiel reichen diese beiden).

    Tabelle 2: Komponenten
    In dieser Tabelle steht der Name, Code und 3 Zeitwerte der Komponenten, aus denen ein Baustein bestehen kann (zeit1, zeit2, zeit3).

    Tabelle 3: Zuordnung
    In dieser Tabelle steht nun eine Referenz zu Bausteine.code, Komponenten.code und Komponenten.zeitwert (in Form von einfach 1, 2 oder 3).


    Bausteine enthält also die übergeordneten Bausteine, Komponenten die Bestandteile derselben und Zuordnung die jeweilige, ja, Zuordnung der Komponenten zu den Bausteinen.

    Nun möchte ich eine SQL-Abfrage schreiben, die mir a) den Namen und Code der Bausteine ausgibt (einfach) und b) den jeweiligen Zeitwert aus den Komponenten summiert. Das Problem dabei ist, dass ich ja nicht nur eine Spalte mit den Zeitwerten habe, sondern deren drei.

    Ich bräuchte also eine Abfrage, die sozusagen "dynamisch" den Spaltennamen anpasst, je nachdem welche Zahl in der Tabelle Zuordnung angegeben wurde.


    Folgendes Beispiel:
    Tabelle Bausteine enthält folgende Daten:
    Code:
    code   name
    AB01   Testbaustein 1
    AB02   Testbaustein 2
    Tabelle Komponenten:
    Code:
    code    name   zeit1   zeit2   zeit3
    0001     Tun      10      20      30
    0002  Machen      25      35      45
    0003  Ebenso      45      60      75
    0009   Blubb       5       6       7
    Tabelle Zuordnung:
    Code:
    baust_code   komp_code   komp_zeit
          AB01        0001           1
          AB01        0003           3
          AB01        0009           2
          AB01        0002           1
          AB02        0003           2
          AB02        0002           3
    Nun müsste ich also von Komponenten den Wert "zeit1" von 0001 addieren mit "zeit3" von 0003, "zeit2" von 0009 und "zeit1" von 0009.

    Und da fängt mein Problem an. Eventuell ist auch die Datenbankstruktur nicht optimal und man könnte es besser lösen. Bis zu diesem Problem fand ich sie jedoch ganz brauchbar, aber da habe ich mal wieder nicht weit genug gedacht.

    Für ein JOIN/SUM() Statement bräuchte ich ja immer den jeweiligen Namen der Tabellenspalte, bzw. würde das überhaupt gehen, wenn verschiedene Spalten angesprochen werden müssen?

    Theoretisch könnte ich den Zeitwert von zeit1 etc. auch in komp_zeit schreiben lassen, allerdings hätte ich dann eine Redundanz, die ich vermeiden will (wenn sich beispielsweise der Zeitwert einer Komponente ändert, müsste dies auch in der Tabelle Zuordnung dann nochmals eingetragen werden).


    Falls die Datenbankstruktur kompletter Unsinn ist, würde ich mich auch über Verbesserungsvorschläge freuen. Ist ja noch kein gewachsenes Projekt sondern gerade in der Entwicklung.


    Hilfe.
    Zuletzt geändert von sp00n; 22.05.2007, 15:41.

  • #2
    Hmm, einen Viertelschritt weiter gekommen.
    Mit CONCAT('bausteine.zeit', zuordnung.komp_zeit) könnte ich zumindest den Spaltennamen zusammensetzen lassen.

    Nur zugreifen müsste ich jetzt noch auf den generierten Spaltennamen können. Das wäre dann ein halber Schritt. *g*

    Kommentar


    • #3
      das ist jetzt n bissi finster... und auf den ersten blick glaube ich, kommst du um eine subquery nicht herum...

      ich bin nicht sicher, ob mysql abfragen über "dynamische" spaltennamen beherrscht...

      um das problem zu umgehen, könnte man die werte zeit1 zeit2 und zeit3 in einer weiteren tabelle aufbewahren... ich hab das nicht ganz durchgespielt.... so dass dann felder comp_index zeit_index zeit_wert darin existieren. und in komponenten hält man nicht mehr die zeit, sondern nur noch eine referenz auf die zeit....

      dann kannst du mit deiner zuordnungstabelle alles genau so zusammenbauen, wie du es brauchst...

      means, du joinst jeweils auf die einzelnen tables unter der bedingung, dass komp_code auch in beiden joined-tables übereinstimmt...

      dann müsste ein SUM möglich sein über die ergebnisspalte...

      nur ein denkansatz... hoffentlich bringts dich weiter...

      greetz, high
      Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
      When everything else fails, manipulate the data...
      Beschriftungen / Großformatdruck / Werbemittel

      Kommentar


      • #4
        Günstiger ist wohl, die zeiten zeit1 bis zeit3 in ein einziges Attribut zu stecken und ein weiteres Attribut, das den Typ angibt.

        Tabelle Komponenten:

        code, name zeit, zeittyp

        Nachteil: mehr Datensätze (für jeden Zeittyp einen)

        Vorteil: Flexibiltät, einfachere Summierung (SUM ..., GROUP BY ...),
        dynamisch (wenn weitere Zeittypen hinzukommen, braucht man wder PHP-Code noch DB-Modell zu ändern )
        Her mittie Abbeit!

        Kommentar


        • #5
          Günstiger ist wohl, die zeiten zeit1 bis zeit3 in ein einziges Attribut zu stecken und ein weiteres Attribut, das den Typ angibt.
          Das habe ich jetzt nicht ganz verstanden. Was meinst du mit Attribut?
          Bzw. wie sähe dann die Tabellenstruktur aus?

          Kommentar


          • #6
            Tabelle 2: Komponenten

            code
            id_zeittyp
            zeit

            Tabelle zeittyp:
            id_zeittyp
            name

            Tabellen sind über id_zeittyp verknüpft.

            Wenn jetzt ein weiterer Zeittyp hinzukommt: Kein Problem.
            Bei deiner Lösung musst du die Datenbankstruktur ändern
            (z.B für zeit4, zeit5 ...)

            code, id_zeittyp, name usw nennt man Attribute.
            Her mittie Abbeit!

            Kommentar


            • #7
              Wie wäre es mit diesem Ansatz:

              PHP-Code:
              SELECT `b`.`code`, 
                  (IF(`
              z`.`Zuordnung` = '1'SUM(`k`.`zeit1`), 0) + IF(`z`.`Zuordnung` = '2'SUM(`k`.`zeit2`), 0) + IF(`z`.`Zuordnung` = '3'SUM(`k`.`zeit3`), 0)) AS `zeit`
              FROM `Bausteine` AS `b`, ... 

              Kommentar

              Lädt...
              X