在SQL查询中对项目进行分组

时间:2010-01-06 17:05:10

标签: sql sql-server sql-server-2000

我有一个像(在sql server 2000中)

列的表
MailCode   Mode   Name     Group
--------  -----  --------- -------
1          1      abc        0
1          1      def        0
1          1      qwe        1
2          2      aaw        0
2          2      aad        0

我想根据文件的其余部分对Name字段进行分组,以便结果看起来像这样(应该只有一个唯一的mailCode,Mode和group组合)

MailCode   Mode      Names            Group
---------   ------   ------------      -------
1           1        abc, def           0
1           1        qwe                1
2           2        aaw, aad           0

如何为此创建SQL查询?

3 个答案:

答案 0 :(得分:1)

SQL Server 2000解决方案

幸运的是,COALESCE is supported in 2000,因此您可以使用COALESCE技巧创建逗号分隔的值列表demonstrated in this link。由于变量的使用,您需要创建一个函数/过程并在主查询中调用它。基本上,只需用函数调用替换下面查询中的STUFF()。

SQL Server 2005+解决方案:

  SELECT x.mailcode,
         x.mode,
         STUFF((SELECT y.name
                  FROM TABLE y
                 WHERE y.mailcode = x.mailcode
                   AND y.mode = x.mode
                   AND y.gropu = x.group
              GROUP BY y.mailcode, y.mode, y.group
               FOR XML PATH(', ')), 1, 1, '') AS name,
         x.group
    FROM TABLE x
GROUP BY x.mailcode, x.mode, x.group

答案 1 :(得分:1)

我有一个类似的问题,我必须在select中连接一个字段,我当时的解决方案是创建一个返回结果的过程,并像这样调用它

选择x为field1,y为field2,dbo.procedure为field3

答案 2 :(得分:0)

我想不出一个能够得到你想要的结果的简单查询,但是这些方面的一些逻辑可以让你到达你想要的地方:

1) Loop through distinct MailCode, Mode, Group Rows
  A) select all names in group
   A.1) Loop through names
   A.2) Concatenate them together into temp variable
  B) insert all data (MailCode, Mode, Group, temp variable) into temp table

在涉及大型数据集时,在SQL中循环,往往会产生巨大的性能损失。遗憾的是,我不知道更好的方法。