Announcement

Collapse
No announcement yet.

[SQL] Spalten aus einer Tabelle generieren

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

  • [SQL] Spalten aus einer Tabelle generieren

    Hallo Leute,

    heute hab ich schon wieder eine richtig komplizierte Frage:

    Erst mal die Tabellen vorab:

    Tabelle 1:
    Beschreibungen
    Code:
    id | beschreibung
    ---+-------------
    1  | Excel
    2  | Word
    3  | Outlook
    Tabelle 2:
    Benutzer
    Code:
    id | benutzer
    ---+-------------
    1  | Fritz
    2  | Huber
    3  | Otto
    Tabelle 3:
    BeschBenutzRel
    Code:
    benid | beschid
    ------+-------------
    1     | 1
    2     | 1
    2     | 2
    3     | 2
    Nun will ich einen Select machen der dann so aussieht (quasi die Zieltabelle):

    Code:
    Beschreibung | Fritz | Huber | Otto
    -------------+-------+-------+-----
    1            | True  | True  | False
    2            | False | True  | True
    3            | False | False | False
    Wie man sehen kann stammen die Tabellen köpfe (2-4) dynamisch aus der Benutzer Tabelle. Dann wird über die Relationstabelle geschaut ob der Benutzer sich mit dem Objekt auskennt und dann über True oder False ausgeben. Ob das jetzt 0 und 1 oder True und False ist, ist mir egal.

    Wie erstelle ich solch einen Select?

    Mit freundlichen Grüßen
    HyP3r

  • #2
    Hallo HyP3r,

    das nennt sich "pivotisieren". Such mal in der Doku zu Deiner DBMS nach "Pivot".
    Ob und wie es geht, hängt eben sehr stark von der verwendeten DBMS ab.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Ich arbeite mit PHP und einer MySQL Datenbank. Ich weiß nicht wie ich eine Pivot Tabelle mit einem MySQL DBMS erstelle aufjedenfall sehen diese Pivot Tabellen in Access sehr sehr gut aus

      Ich werde mal googlen falls du/ihr noch irgendwelche vorschläge habt könnt ihr se ja gerne posten

      mfg
      HyP3r

      Comment


      • #4
        Von daher ist es gut, spezielle Fragen hier ins entsprechende Forum zu posten, also ins mySQL Forum.

        Ich für meinen Teil kenne mich nicht mit mySQL aus, mehr mit MS SQL und MS Access; dort gibt es ja sogar einen ganz netten Assistenten für Pivot-Abfragen.
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Picottabelle in MySQL

          Hallo HyP3r,

          wenn du mit MySQL arbeitest, dann arbeitest du doch auch mit PHP.
          Du kannst doch in PHP mit select * from Benutzer und einer foreach-Schleife einen crate table-Befehl zusammenstellen, der dir eine Hilfstabelle erzeugt, die für jeden Benutzer eine Spalte enthält. Dann durchläufst du die Tabelle BeschBenutzRel und erzeugst bei jedem Datensatz einen Update auf die Hilfstabelle, die du danach ausgibst.

          Eine andere Lösung könnte darin bestehen, dass du über PHP einen Select der Form:

          Select beschid,sum(Fritz) as Fritz, sum(Huber) as Huber... From
          (Select beschid, case benid 1 then 1 else 0 end; as Fritz, case benid 2 then 1 else 0 end; as huber,...)
          Group by beschid


          zusammenstellst un dann ausführst. Wenn das so nicht geht, ist das vielleicht eine Anregung für weitere Ideen.

          Comment


          • #6
            Kurze Ergänzung:
            In dem Select Variante2 in ein Syntaxfehler. Es muss heißen case benid when 1 then 1...
            Bisser ist aber:
            Select beschid, if(benid=1,1,0) as Fritz, if(benid=2,1,0) as Huber,...

            Comment


            • #7
              Das Ergebnis das ich durch den Tipp vom Wiedehopf erzeugen sieht schon sehr sehr gut aus

              Code:
              beschreibung | User1 | User2 | User3 | User4
              Excel        | 1     | 0     | 1     | 0
              Word         | 1     | 1     | 0     | 1
              Outlook      | 1     | 0     | 0     | 0
              Query:
              Code:
              Select 
              	beschreibung.beschreibung,
              	sum(User1),
              	sum(User2),
              	sum(User3),
              	sum(User4)
              From
              	(
              	Select 
              		benbeschrel.BeschID,
              		if(benbeschrel.benid=1,1,0) as User1,
              		if(benbeschrel.benid=2,1,0) as User2,
              		if(benbeschrel.benid=3,1,0) as User3,
              		if(benbeschrel.benid=4,1,0) as User4
              	From
              		benbeschrel
              	) As SubSelect,
              	beschreibung
              Where
              	SubSelect.BeschID = beschreibung.id
              Group by
              	BeschID
              Jetzt fehlt nur noch das alle Zeilen angezeigt werden auch wenn zu dieser Beschreibung kein User zugeordnet ist. Ich hab leider keine ahnung wie ich das anstellen (ich bin irgendwie bei SQL/mySQL immer so hilflos)

              mfg
              HyP3r

              €: Die erste version die ich hatte musste ich für jede beschreibung und für jeden User (z.b. 10 User und 100 Beschreibungen) einen Query machen (= 10*100 = 1000 Querys). Wenn ich jetzt 2 Querys mache ist das aufjedenfall ein gewisser fortschritt.

              Comment


              • #8
                hat dazu noch einer Idee? Ich denke es war keine gute idee es in das mySQL Forum zu verschieben...

                Comment


                • #9
                  Originally posted by HyP3r View Post
                  hat dazu noch einer Idee? Ich denke es war keine gute idee es in das mySQL Forum zu verschieben...
                  Wieso nicht? Was bringt dir ein SQL-Statement für MS SQL Server wenn dein MySQL Server damit nix anfangen kann?

                  Comment


                  • #10
                    Ja aber ich erstell ja keine Prozeduren die sehr DBMS abhänig sind das sind doch alles ganz allgemeine Query's die jedes DBMS frisst. Aber wichtig ist mir das mir einer nen Tipp gibt wie ich die restlichen zeilen auch noch anzeigen kann

                    Comment


                    • #11
                      Hallo,
                      Originally posted by HyP3r View Post
                      ...Jetzt fehlt nur noch das alle Zeilen angezeigt werden auch wenn zu dieser Beschreibung kein User zugeordnet ist.
                      Wie wäre es da mit einem expliziten OUTER JOIN statt dem impliziten INNER JOIN!?
                      [highlight=sql]
                      ... As SubSelect
                      OUTER JOIN beschreibung on SubSelect.BeschID = beschreibung.id
                      Group by
                      BeschID
                      [/highlight]
                      Originally posted by HyP3r View Post
                      ...Ich hab leider keine ahnung wie ich das anstellen (ich bin irgendwie bei SQL/mySQL immer so hilflos)
                      Das sind aber Basics und dabei hilft Lesen, Lesen und Lesen...

                      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


                      • #12
                        Auch Beschreibungen ohne User anzeigen

                        Hallo HyP3r,

                        wenn ich dich richtig verstehe, gibt es Beschreibungen, für die es keinen Datensatz in der Tabelle benbeschrel gibt. Die sollen dann aber in der Ausgabe mit Nullen in jeder Spalte erscheinen.
                        Du brauchst doch bloß in die Tabelle benbeschrel für jede Beschreibung einen Datensatz mit benid=0 reinschreiben.

                        Comment

                        Working...
                        X