2012-05-05 63 views
4

我有一個查詢,看起來像這樣SQL服務器串連GROUP BY

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

返回下面的數據集(簡化,作業ID實際上是一個唯一標識符)現在

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

,我想以JobID-column進行分組並連接標題,所以結果如下

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

我該怎麼做?

+2

看到http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server –

+0

我有一個答案,但參考以上非常好。 Arion的答案使用相同的方法。 – Paparazzi

回答

10

如果您使用的是sql server 2005+。然後,你可以這樣做:

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

編輯

因爲你沒有告訴我們的表結構,並在不同的表中的數據。這有點難以分辨。所以,我認爲你的表結構看起來是這樣的:

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 

因此,在未來總是顯示什麼表結構和它數據。這會給你更好的答案

+0

這實際上返回了與我的第一個查詢完全相同的數據... –

+0

我對此嘗試了一點,並最終添加了一個Group,「GROUP BY JobsTagMap.JobID」,但隨後出現此錯誤 「Column」 JobsTagMap.TagID'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。「 –

+0

更新了答案 – Arion

1

我使用了一個標量函數。有一些純粹的說法認爲,絕對不應該使用基於行的操作,但是嘿,這會起作用,如果你只是返回幾行,那麼響應時間就沒有問題。

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