Question

Je suis bloqué sur un problème d'agrégation que je ne peux pas aller au fond de.

J'ai des données qui est le mieux résumée comme suit

id |phraseId|seqNum|word
=========================
1  |1       |1     |hello
2  |1       |2     |world
3  |2       |1     |black
4  |2       |2     |and
5  |2       |3     |white

Je voudrais une requête qui rend les données suivantes:

phraseId|completePhrase
========================
1       |hello world
2       |black and white

Tout le monde?

EDIT

Je remarque toutes les solutions proposées utilisent FOR XML PATH. Qu'est-ce que cette magie?

Autres conseils

essayez ceci:

DECLARE @TableA  table (RowID int, phraseId varchar(5),seqNum int, word varchar(5))

INSERT INTO @TableA VALUES (1,1,1,'hello')
INSERT INTO @TableA VALUES (2,1,2,'world')
INSERT INTO @TableA VALUES (3,2,1,'black')
INSERT INTO @TableA VALUES (4,2,2,'and')
INSERT INTO @TableA VALUES (5,2,3,'white')

SELECT
    c1.phraseId
        ,STUFF(
                 (SELECT
                      ' ' + word
                      FROM @TableA  c2
                      WHERE c2.phraseId=c1.phraseId
                      ORDER BY c1.phraseId, seqNum
                      FOR XML PATH('') 
                 )
                 ,1,1, ''
              ) AS CombinedValue
    FROM @TableA c1
    GROUP BY c1.phraseId
    ORDER BY c1.phraseId

SORTIE:

phraseId CombinedValue
-------- --------------------------
1        hello world
2        black and white

(2 row(s) affected)

Je suis un peu triché en supposant que vous avez une table qui détient le record d'en-tête pour chaque phrase. Si ce manque, vous pouvez construire en sélectionnant une liste distincte de phraseIDs de la table contenant les mots:

declare @words table
(id int
,phraseId int
,seqNum int
,word varchar(10)
)

insert @words
select 1,1,1,'hello'
union select 2,1,2,'world'
union select 3,2,1,'black'
union select 4,2,2,'and'
union select 5,2,4,'white'

declare @phrase table
(phraseId int)

insert @phrase
select 1
union select 2

select phraseID
       ,phraseText AS completePhrase
FROM @phrase AS p
CROSS APPLY (select word + ' ' as [text()]
             from @words AS w
             where w.phraseID = p.phraseID
             for xml path('')
            ) as phrases (phraseText)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top