【问题标题】:SQL - Distinct on two columns and summarized values on thirdSQL - 两列不同,第三列汇总值
【发布时间】:2011-04-17 17:32:29
【问题描述】:

我有一张有 3 个不同 ID 的表。我想区分第 1 列和第 2 列并总结第 3 列的值(到一个字段中 - 可能是逗号分隔的字符串)。汇总字段不必“看起来不错”(没有问题:'4,3,'(最后的逗号))。 我正在使用 MS SQL Server 2008。

例如:

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

【问题讨论】:

    标签: sql sql-server select distinct


    【解决方案1】:

    编辑 - 删除第三列中的尾随空格

    既然你说汇总字段不一定要好看,试试这个:

    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
    

    【讨论】:

    【解决方案2】:

    MSSQL 中没有内置的聚合可以实现这一点。这个link 显示了基于组连接字符串值的多种方式。

    【讨论】:

      【解决方案3】:

      我在 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;

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 2020-08-11
        • 1970-01-01
        相关资源
        最近更新 更多