Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中每个记录的分组和计数值_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL中每个记录的分组和计数值

SQL中每个记录的分组和计数值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图运行一个select语句来对具有相似ID的记录进行分组,但也会对每个主ID的另一列的值进行计数。例如下面的例子。每行的结果将是第一个实例唯一ID和每个记录中显示的两个名称(用分号分隔)。提前谢谢 当前集 ID Name Cnt -------------------------------- ----------------- --- 0001D72BA5F664BE129B6AB5744E2BE0 Ta

我试图运行一个select语句来对具有相似ID的记录进行分组,但也会对每个主ID的另一列的值进行计数。例如下面的例子。每行的结果将是第一个实例唯一ID和每个记录中显示的两个名称(用分号分隔)。提前谢谢

当前集

ID                               Name              Cnt
-------------------------------- ----------------- ---
0001D72BA5F664BE129B6AB5744E2BE0 Talati, Shilpa    1
0001D72BA5F664BE129B6AB5744E2BE0 Weaver, Larry     1
0007EAB7CE9A3F2F95D2D63D0BBD08A9 St-Hilaire, Edith 1
0007EAB7CE9A3F2F95D2D63D0BBD08A9 Talati, Shilpa    1
结果:

0001D72BA5F664BE129B6AB5744E2BE0 Talati, Shilpa; Weaver, Larry  

在SQL Server中解决此问题的最简单方法是:

select masterId, min(name) + '; ' + max(name)
from table t
group by masterId;

这里有一种使用递归公共表表达式的方法。给出这样一张表:

create table dbo.Fizzbuzz
(
  id       int         not null identity(1,1) primary key clustered ,
  group_id int         not null ,
  name     varchar(50) not null ,
  cnt      int         not null ,
)
包含此数据

id group_id name   cnt
-- -------- ------ ---
1  1        Bob      3
2  1        Carol    5
3  1        Ted      6
4  1        Alice   16
5  2        Harold  72
6  2        Maude   28
这个问题

with recursive_cte as
(
  select group_id = t.group_id ,
         row      = t.row      ,
         name     = convert(varchar(8000),t.name) ,
         cnt      = t.cnt
  from ( select * ,
                row = row_number() over (
                        partition by group_id
                        order by id
                        )
         from dbo.Fizzbuzz
       ) t
  where t.row = 1
  UNION ALL
  select group_id = prv.group_id ,
         row      = nxt.row      ,
         name     = convert(varchar(8000), prv.name + ' and ' + nxt.name ) ,
         cnt      = prv.cnt  + nxt.cnt
  from recursive_cte prv
  join ( select * ,
                row = row_number() over (
                        partition by group_id
                        order by id
                        )
         from dbo.Fizzbuzz
       ) nxt on nxt.group_id = prv.group_id
            and nxt.row      = prv.row + 1
)
select group_id = t.group_id ,
       total    = t.cnt      ,
       names    = t.name
from ( select * ,
              rank = rank() over (
                       partition by group_id
                       order by row desc
                     )
       from recursive_cte
     ) t
where rank = 1
order by group_id
生成以下输出

group_id cnt name
-------- --- -------------------------------
    1     30 Bob and Carol and Ted and Alice
    2    100 Harold and Maude

但是,应该注意,递归的深度在SQL Server中是有限的。

您使用的是什么数据库?为什么结果只有一行而不是两行?Sql server 2008谢谢您,但我有一些ID存在超过2次,并且它不会获取所有名称值。@user3622204。您的问题是明确的:“每个记录显示两个名称,用分号分隔。”超过两个名称,您就有SQL Server中的一般字符串聚合问题。我建议你搜索一下,而不是再问一个问题。
SELECT  
      t1.ID, 
      (SELECT Name + '; ' 
       FROM yourtable t2 
       WHERE t1.ID = t2.ID 
       for xml path('')) as Name
FROM yourtable t1 
GROUP BY t1.ID