2009-11-23 20 views
0
ID   Name 
1   A 
1   B 
1   C 
2   X 
2   Y 
3   P 
3   Q 
3   R 

Ce sont les colonnes d'un tableau. Je veux obtenir une sortie commeDuplicata sans utiliser While ou Cursor dans T-SQL

ID Company 
    1 A,B,C 
    2 X, Y 
    3 P,Q,R 

restriction est que je ne peux pas utiliser WHILE ou CURSEUR. S'il vous plaît écrire une requête pour le même.

+3

quelle version de SQL Server ??? –

+0

Vous voulez que les noms de sociétés soient séparés par une virgule? Pourquoi? – mcintyre321

Répondre

3

Cette requête devrait le faire - utilise FOR XML PATH qui est nouveau dans SQL Server 2005 - espère que vous êtes en 2005 ou plus, vous ne l'avez pas spécifié clairement .....

SELECT 
    ID, 
    STUFF(CAST((SELECT ','+Name FROM dbo.YourTable t2 
       WHERE t2.ID = dbo.YourTable.ID 
       FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 1, '') AS 'Company' 
FROM 
    dbo.YourTable 
GROUP BY 
    ID 
1

Pour la version 2005:

CREATE TABLE dbo.TEST([Type] INTEGER, [Name] NVARCHAR(100), [Qty] INTEGER) 
GO 
INSERT dbo.TEST VALUES(1, N'a', 5) 
INSERT dbo.TEST VALUES(1, N'b', 6) 
INSERT dbo.TEST VALUES(2, N'c', 44) 
INSERT dbo.TEST VALUES(3, N'd', 1) 
GO 

select [Type], 
[Description] = replace((select [Name] + ':' + cast([Qty] as varchar) as 'data()'  
from TEST where [Type] = t.[Type] for xml path('')), ' ', ',') 
from dbo.TEST t 
group by [Type] 

go 

drop table dbo.TEST 
2

Voici une solution en utilisant la méthode CROSS POSTULER:

select id, sub.names 
from (
    select distinct id from YourTable 
) a 
cross apply (
    select name + ', ' as [text()] 
    from YourTable b 
    where b.id = a.id 
    for xml path('') 
) sub(names) 
0

Vous pouvez regrouper sur l'ID pour obtenir les valeurs uniques, obtenez alors la virgule chaîne séparés pour chaque aide d'une requête for xml:

select 
    a.ID, 
    substring((
    select ', ' + Name 
    from Test1 
    where Test1.ID = a.ID 
    for xml path('') 
), 3, 1000) as Company 
from 
    TheTable a 
group by 
    a.ID 
Questions connexes