2010-09-27 52 views
4

我有一個包含3個不同ID的表。我想區分第1列和第2列,並總結第3列的值(在一個字段中 - 可能是逗號分隔的字符串)。總結的字段不必「看起來不錯」(沒有問題:'4,3,'(最後的逗號))。 我使用MS SQL Server 2008的SQL - 第三列上的兩列和彙總值不同

E.g:

ID1 ID2 ID3 
1 1 5 
1 1 8 
1 2 5 
1 2 8 
2 3 10 
2 3 11 
2 5 12 

SELECT ...?

結果:

ID1 ID2 Summary 
1  1  5,8 
1  2  5,8 
2  3  10,11 
2  5  12 

回答

5

編輯 - 刪除第三列尾隨空格

既然你說的彙總字段不必好看,試試這個:

SELECT M1.ID1, M1.ID2, 
(
    SELECT convert(nvarchar(50), ID3) + ',' 
    FROM MyTable M2 
    WHERE M1.ID1 = M2.ID1 AND M1.ID2 = M2.ID2 
    FOR XML PATH('') 
) M1 
FROM MyTable M1 
GROUP BY M1.ID1, M1.ID2 

它假定你的表的名字叫'MyTable的'。這個查詢結果以逗號結尾,但應該讓你開始。用我的測試數據庫,這是輸出:

ID1 ID2 M1 
1 1 5,8, 
1 2 5,8, 
2 3 10,11, 
2 5 12, 

如果你想它清理乾淨,這應該工作(儘管查詢本身是醜陋的):

SELECT ID1, ID2, left(M1, len(M1) - 1) AS M1 
FROM 
(
    SELECT M1.ID1, M1.ID2, 
    (
     SELECT convert(nvarchar(50), ID3) + ',' 
     FROM MyTable M2 
     WHERE M1.ID1 = M2.ID1 AND M1.ID2 = M2.ID2 
     FOR XML PATH('') 
    ) M1 
    FROM MyTable M1 
    GROUP BY M1.ID1, M1.ID2 
) CleanedUp 
+0

+1組由+ XML路徑,但你應該考慮的東西()清理的S tring,看到這個:http://stackoverflow.com/questions/1591325/concatenating-records-in-a-single-column-without-looping/1594824#1594824 – 2010-09-27 12:47:59

+0

@KM - 謝謝你的指針,感謝它 – LittleBobbyTables 2010-09-27 12:51:25

2

有MSSQL中沒有內置的聚集,可以實現這一點。這個link顯示了基於一個組連接字符串值的多種方式。

0

我這樣做,在甲骨文,但我想你可以做同樣的SQL Server


select id1, id2, testfunction(id1, id2) 
from test 
group by id1, id2; 

的testfunction被定義爲


create or replace function testfunction(v_id1 in number, v_id2 in number) return varchar2 is 
    v_result varchar2(200); 
    v_id3 number;
cursor ids(p_id1 in number, p_id2 in number) is select id3 from test where id1 = p_id1 and id2 = p_id2; begin open ids(v_id1, v_id2); loop fetch ids into v_id3; exit when ids%notfound;
v_result := v_result || v_id3 || ','; end loop; close ids;
return(v_result); end testfunction;

相關問題