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