none
Verketten von Telnehmern in einer zeile by vorgang RRS feed

  • Frage

  • Liebe Experts,

    bitte Hilfe

    in Anlehnung zur meiner vorheriges Thema:

    http://social.msdn.microsoft.com/Forums/de-DE/sqlserverde/thread/944a9d0d-8387-4be6-9233-5d2467c7978b/#944a9d0d-8387-4be6-9233-5d2467c7978b

    wo ich die verketteten Teilnehmer zählen muss, möchte ich diese erstmal überhaupt verketten, aber wie?

    dies hier (s. unten) verkettet alle Teilnehmer, unabhängig von der vorgangsNr:

    declare @result as varchar(255)
    declare @zeile as varchar(100)
    set @result = ''

    declare result_cursor CURSOR FOR
        select  --VORGANG,
        name FROM TEILNEHMER t
        inner join VORGANG_Teilnehmer v WITH ( NOLOCK ) on V.ID = T.VORGANG
        order BY v.VORGANG

    open result_cursor

    fetch next from result_cursor INTO @zeile
    WHILE @@FETCH_STATUS = 0
    BEGIN

        set @result = @result+' / '+replace(@zeile, '/', ',')
        
        fetch next from result_cursor INTO @zeile
    end
    close result_cursor
    deallocate result_cursor

    select @result

    Vielen Dank bereits vorab

    Irina

    Freitag, 9. Mai 2014 11:08

Antworten

  • Hallo Irina,

    anstatt eines Cursors kann man eine separierte Liste über die FOR XML Klausel erzeugen, siehe z. B.:

    Comma delimited list creation in SQL Server T-SQL -Using XML PATH & correlated subquery for sublist Performance issue

    Für Deine Tabellen (verkürzt und mit Annahmen) könnte das wie folgt aussehen:

    CREATE TABLE dbo.Teilnehmer (Vorgang int);
    CREATE TABLE dbo.Vorgang_Teilnehmer (Id int, Name varchar(10));
    
    INSERT INTO Teilnehmer (Vorgang) VALUES (1000), (2000), (3000); 
    INSERT INTO Vorgang_Teilnehmer (Id, Name) VALUES 
    	(1000, 'A'), (1000, 'B'), (1000, 'C'),
    	(2000, 'E'), (2000, 'F');
    	
    SELECT t.Vorgang,
    	(SELECT COUNT(*) FROM Vorgang_Teilnehmer AS v WHERE t.Vorgang = v.Id) AS NamenAnzahl,
    	Namen = LEFT(n.namen, LEN(n.namen)-1) 
    FROM Teilnehmer AS t
    CROSS APPLY
    (
       SELECT REPLACE(v.Name, '/', '') + '/' AS [text()]
       FROM Vorgang_Teilnehmer AS v
       WHERE t.Vorgang  = v.Id
       ORDER BY v.Name
       FOR XML PATH('')) AS n(namen)
    ORDER BY t.Vorgang;    

    Im Nebengang wird die Anzahl über eine Unterabfrage ermittelt, was einfacher ist als Dein Ansatz in der anderen Diskussion.

    Gruß Elmar

    Freitag, 9. Mai 2014 17:06
    Beantworter