Announcement

Collapse
No announcement yet.

Datensätze kombinieren und in ein Feld (Array?) schreiben

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

  • Datensätze kombinieren und in ein Feld (Array?) schreiben

    Moin,

    es gibt eine Tabelle mit Artikelköpfe und eine Tabelle mit Artikelpositionen. Wenn ein Kopf mehrere Positionen besitzt, möchte ich diese Positionen alle mit einem Komma getrennt in ein Feld schreiben.

    Zur Veranschaulichung ein kurzes Beispiel:

    Code:
       WITH  Data1 (Lehrer, FachID, Name) AS 
       (  SELECT 100, '1', 'Bio' UNION ALL
          SELECT 101, '2', 'Mathe' UNION ALL
          SELECT 102, '3', 'Deutsch' UNION ALL
          SELECT 103, '1', 'Bio' UNION ALL
          SELECT 103, '2', 'Mathe' UNION ALL
          SELECT 104, '4', 'Englisch'
        )
    SELECT   Lehrer, FachID + ' / ' + Name AS Kombi
    FROM Data1

    Ergebnis:

    Lehrer Kombi
    100 1 / Bio
    101 2 / Mathe
    102 3 / Deutsch
    103 1 / Bio
    103 2 / Mathe
    104 4 / Englisch


    Ich möchte jedoch, dass der Lehrer 103 nur einmal aufgeführt wird und bei Kombi im Feld nur "1 / Bio, 2 / Mathe" steht.

    Kann mir jemand auf die Sprünge helfen? Codefragmente sind willkommen ;-)

    Liebe Grüße

  • #2
    Originally posted by Laie View Post
    Kann mir jemand auf die Sprünge helfen? Codefragmente sind willkommen ;-)
    Null problemo, ab MS-SQL-Server 2005:
    [HIGHLIGHT="SQL"]WITH Data1 (Lehrer, FachID, Name) AS
    ( SELECT 100, '1', 'Bio' UNION ALL
    SELECT 101, '2', 'Mathe' UNION ALL
    SELECT 102, '3', 'Deutsch' UNION ALL
    SELECT 103, '1', 'Bio' UNION ALL
    SELECT 103, '2', 'Mathe' UNION ALL
    SELECT 104, '4', 'Englisch'
    )
    SELECT DISTINCT
    D1. Lehrer
    , STUFF (X.Kombinationen, 1, 2, SPACE(0))
    FROM Data1 AS D1
    CROSS APPLY ( SELECT ', ' + FachID + ' / ' + Name
    FROM Data1 AS D2
    WHERE D1.Lehrer = D2.Lehrer
    FOR XML PATH ('')
    ) AS X( Kombinationen )
    [/HIGHLIGHT]

    PS: Danke für die Vorlage mit dem WITH...

    Comment


    • #3
      Hallo,

      vielen Dank für deine Antwort. Mein genanntes Beispiel war wohl leider zu einfach gewählt bzw. ich schaffe es nicht, deine Lösung auf mein Problem anzuwenden ;-(

      Leider verschwieg ich dir, dass die Informationen aus verschiedenen Tabellen kommen. Ich habe nun deine Lösung mehrfach versucht aber ich muss zugeben, dass ich mich mit SQL zu wenig auskenne, um das Problem selbst zu lösen.

      Könntest du mir mitteilen, welcher Syntax- bzw. Denkfehler im Code noch vorhanden ist?

      Besten Dank


      Code:
          SELECT a.LehrerID,
                 b.FachID,
                 c.FachName,
                 STUFF (X.Kombination, 1, 2, SPACE(0))
           FROM dbo.Lehrer a
      
      		LEFT JOIN FaecherID b		ON a.ID = b.ID
      		LEFT JOIN FaecherName c		ON b.ID = c.ID
      
      	CROSS APPLY (SELECT ', ' + b.FachID + ' / ' + c.FachName
      				 FROM a
      				 WHERE b.FachID = c.FachID
      				 FOR XML PATH ('')
      				 )
      				 AS X(Kombination)

      Comment


      • #4
        LEFT JOIN FaecherID b ON a.ID = b.ID
        LEFT JOIN FaecherName c ON b.ID = c.ID
        echt, extra Tabellen für FaecherID und Faechername??? gewöhnungsbedürftig

        Na gut, ohne weitere Kenntnis der Tabellenstrukturen, rat ich mal folgendes:
        Originally posted by Laie View Post
        [HIGHLIGHT="SQL"]SELECT DISTINCT --- nicht vergessen
        a.LehrerID,
        a.FachID,
        b.FachName,
        STUFF (X.Kombination, 1, 2, SPACE(0))
        FROM dbo.Lehrer AS a1
        /* LEFT JOIN FaecherID b ON a.ID = b.ID
        LEFT JOIN FaecherName c ON b.ID = c.ID Ein Join zuviel, denn wenn a =b und b = c dann auch a = c.... */
        CROSS APPLY (SELECT ', ' + a.FachID + ' / ' + c.FachName
        FROM dbo.Lehrer AS a2 /* FROM a -- mußt schon die Lehrer Tabelle angeben */
        /* WHERE b.FachID = c.FachID -- Fachid oder id??? */
        JOIN FaecherName AS c ON a2.FachiD = c.FachID
        WHERE a1.Lehrer = a2.Lehrer -- muss sein, du willst das ja pro lehrer haben
        FOR XML PATH ('') ) AS X(Kombination)
        JOIN FaecherName AS b ON a1.FachiD = b.fachID -- und nun noch den Fachnamen dazu joinen
        [/HIGHLIGHT]

        Comment

        Working...
        X