2010-07-07 8 views
1

J'utilise Microsoft SQL Server 2005.Concaténer plusieurs lignes

Je pense que j'ai besoin d'une sous-requête.

Je recherche une (1) ligne par client, le champ AvailableAction étant une concaténation de toutes les actions pour chaque client.

use tempdb 
GO 
IF DB_ID('myDatabase') IS NOT NULL 
    DROP DATABASE myDatabase 
go 
CREATE DATABASE myDatabase 
GO 
USE myDatabase 
GO 
create table Cust(
CustID Int Identity Primary Key, 
CustName Varchar(255) 
) 
GO 
INSERT INTO Cust(CustName) values('One') 
INSERT INTO Cust(CustName) values('Two') 
GO 
CREATE TABLE Action(
ActionID Int Identity(101,1) Primary Key, 
ActionName Varchar(128) 
) 
GO 
INSERT INTO Action(ActionName) VALUES('Insert') 
INSERT INTO Action(ActionName) VALUES('Update') 
INSERT INTO Action(ActionName) VALUES('Delete') 
INSERT INTO Action(ActionName) VALUES('Print') 
GO 
create table CustAction(
CustActionID Int Identity Primary Key, 
CustID Int, 
ActionID Int 
) 
GO 
INSERT INTO CustAction(CustID,ActionID) VALUES(1,101) 
INSERT INTO CustAction(CustID,ActionID) VALUES(1,102) 
INSERT INTO CustAction(CustID,ActionID) VALUES(2,102) 
INSERT INTO CustAction(CustID,ActionID) VALUES(2,103) 
GO 
SELECT Cust.CustID,CustName,ActionName 
FROM CustAction 
JOIN Cust 
ON CustAction.CustID = Cust.CustID 
JOIN Action 
ON CustAction.ActionID = Action.ActionID 
GO 
SELECT 
Cust.CustID,CustName, 
'<option value="' + CAST(Action.ActionID AS Varchar) + '">' + ActionName + '</option>' AS AvailableAction 
FROM CustAction 
JOIN Cust 
ON CustAction.CustID = Cust.CustID 
JOIN Action 
ON CustAction.ActionID = Action.ActionID 

Je voudrais que la sortie soit:

CustID AvailableAction 

    1 <option value="101">Insert</option><option value="102">Update</option> 
    2 <option value="102">Update</option><option value="103">Delete</option> 

Répondre

3

Pour 2005+

SELECT CustID 
    , (SELECT ca.ActionID [@value] 
      , ActionName [text()] 
      FROM dbo.CustAction ca 
     INNER JOIN dbo.Action ON ca.ActionID = Action.ActionID 
     WHERE ca.CustID = c.CustID 
      FOR XML PATH('option'), TYPE) AvailableAction 
    FROM dbo.Cust c 

Je ne pense pas que vous serez en mesure d'obtenir cela avec FOR XML EXPLICIT, donc si c'est 2000, vous êtes hors de la chance (pour autant que solutions simples vont).

+1

Oh ouah! C'est totalement génial. –

+0

+1 Je savais qu'il devait y avoir un meilleur moyen! –

1

Voici une manière que je suis sûr, sera amélioré par quelqu'un qui connaît XML SQL Server!

SELECT CustID , 
     CustName, 
     REPLACE(REPLACE(
     (SELECT '<option value="' + CAST(ACTION.ActionID AS VARCHAR) + '">' + ActionName + '</option>' 
     FROM ACTION 
       JOIN CustAction 
       ON  CustAction.CustID = Cust.CustID 
     WHERE CustAction.ActionID  = ACTION.ActionID FOR XML PATH('') 
     ) 
     ,'&lt;','<'),'&gt;','>') AvailableAction 
FROM Cust 
Questions connexes