SQL - 两列上的区别和第三列的汇总值

时间:2010-09-27 11:30:19

标签: sql sql-server select distinct

我有一张包含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

3 个答案:

答案 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;