2010-07-08 4 views
1

J'ai une tableConcatenate ORDER PRESERVATION

tblSomeData

OrderOccurance  ID Data 
    --------------  -- ---- 
    1     1 HTMedia 
    2     1 Hedge 
    3     1 Bowing 
    4     1 FonWirelessLtd 

La première colonne "OrderOccurance" indique dans quel ordre les éléments à savoir les données apparaîtront dans la sortie finale

Le Sortie attendue sera

ID Data 
-- ----- 
1 HTMedia,Hedge,Bowing,FonWirelessLtd 

je l'ai fait le programme ci-dessous

Select 
    ID 
    , Data = stuff((Select ',' + Cast(Data As Varchar(20)) From tblSomeData t2 
      Where t2.ID = t1.ID for xml path('')),1,1,'') 
From tblSomeData t1 
Group by t1.ID 

Je reçois la sortie comme

ID Data 
-- ----- 
1 Bowing,FonWirelessLtd,Hedge,HTMedia 

Il semble que, FOR sortes PATH() XML par lui-même et exécute alors la concaténation.

Comment puis-je apporter la sortie attendue.

J'utilise SQL Server 2005.

Merci

Répondre

1

Si vous voulez commander, vous devez dire ce que SQL Server colonne par - dans votre requête en cours, vous n'avez pas ORDER BY clause. Il suffit d'ajouter cela et vous devriez être bien:

SELECT 
    ID, 
    Data = STUFF(
       (SELECT ',' + CAST(Data As VARCHAR(20)) 
       FROM dbo.tblSomeData t2 
       WHERE t2.ID = t1.ID 
       ORDER BY OrderOccurance 
       FOR XML PATH('')), 1, 1, '') 
FROM 
    dbo.tblSomeData t1 
GROUP BY 
    t1.ID 
+0

C'est très bien monsieur .. 1 question de plus. Généralement, dans les sous-requêtes, nous ne pouvons pas écrire l'ordre par clause. Le serveur sql signale une erreur (pour autant que je sache ... veuillez me corriger si je me trompe). Alors pourquoi ça marche dans ce cas? – learner

+0

@learner: Je ne saurais pas pourquoi ORDER BY ne devrait pas fonctionner dans une sous-requête - attention à montrer un exemple concret ?? –

Questions connexes