我有一张包含3个不同ID的表格。我想对第1列和第2列进行区分,并总结第3列的值(进入一个字段 - 可能是逗号分隔的字符串)。汇总字段不必“看起来很好”(没有问题:'4,3,'(最后逗号))。 我正在使用MS SQL Server 2008。
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
选择......?
结果:
ID1 ID2 Summary
1 1 5,8
1 2 5,8
2 3 10,11
2 5 12
答案 0 :(得分: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
答案 1 :(得分:2)
MSSQL中没有可以实现这一目标的内置聚合。此link显示了基于组连接字符串值的多种方法。
答案 2 :(得分:0)
我是在Oracle中做到的,但我认为你可以在SQL Server中做同样的事情
select id1, id2, testfunction(id1, id2)
from test
group by id1, id2;
测试功能定义为
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;