Вопрос по sql, sql-server – Конкатенация SQL Server GROUP BY

4

У меня есть запрос, который выглядит так

SELECT J.JobID,T.Title FROM JobsTagMap J
Left Join Tags T
ON J.TagID=T.TagID

Это возвращает следующий набор данных (упрощенно, JobID на самом деле является UniqueIdentifier)

JobID    Title
1        Tag1
1        Tag2
2        Tag2
2        Tag5
2        Tag9

Теперь я хотел бы сгруппировать это по столбцу JobID и объединить заголовок, чтобы результаты были следующими

JobID    Title
1        Tag1,Tag2
2        Tag2,Tag5,Tag9

Как бы я это сделал?

увидетьstackoverflow.com/questions/273238/… Filip De Vos
У меня был один из ответов, но ссылка выше превосходна. Ответ от Ариона использует тот же подход. paparazzo

Ваш Ответ

2   ответа
1

который decry никогда не должен использовать операцию на основе строк, но эй, это работает, и если вы возвращаете только несколько строк, тогда время отклика в порядке.

CREATE FUNCTION [dbo].[JoinMVText]

(

  @sID int,

  @fieldID tinyint

)

RETURNS VARCHAR(MAX)

AS 

BEGIN

   DECLARE @MVtextList varchar(max)

   SELECT @MVtextList = COALESCE(@MVtextList + '; ', '') + docMVtext.value

   FROM docMVtext with (nolock) 

   WHERE docMVtext.sID = @sID and fieldID = @fieldID

   RETURN @MVtextList

END
10

SELECT 
    JobsTagMap.JobID,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
            WHERE
                Tags.TagID=JobsTagMap.TagID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM JobsTagMap

EDIT

Потому что вы не показали нам структуру таблицы и данные в разных таблицах. Это было немного сложно узнать. Итак, я предполагаю, что ваша структура таблицы выглядит примерно так:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

CREATE TABLE Tags
(
    TagID INT,
    Title VARCHAR(100)
)

С этими данными:

INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)

INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')

Если вы получаете те данные, которые вы показываетеJobID не может быть уникальным Вы могли бы иметьJob стол где-нибудь, где он уникален. Если вы просто хотите использовать эти таблицы, которые вы показываете, вам нужно сделать что-то вроде этого:

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
        JobsTagMap.*
    FROM
        JobsTagMap
)
SELECT
    *,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
                JOIN JobsTagMap
                    ON Tags.TagID=JobsTagMap.TagID
            WHERE
                JobsTagMap.JobID=CTE.JobID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM
    CTE
WHERE
    CTE.RowNbr=1

Это даст вам такой результат:

1   1   1   Tag1,Tag2
1   2   2   Tag2,Tag5,Tag9

Так что в будущем всегда показывай чтоtable structure и этоdata, Это даст вам лучшие ответы

Error: User Rate Limit Exceeded Anton Gildebrand
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Anton Gildebrand

Похожие вопросы