我的数据为人与人之间的个人关系重复了一行。例如,以下陈述约翰·史密斯(John Smith)被3名员工认识:
Person EmployeeWhoKnowsPerson
John Smith Derek Jones
John Smith Adrian Daniels
John Smith Peter Low
我正在尝试执行以下操作:
1)计算认识约翰·史密斯的人数。我已经通过row_number()函数完成了此操作,它似乎表现为:
select Person, MAX(rowrank) as rowrank
from (
select Person, EmployeeWhoKnowsPerson, rowrank=ROW_NUMBER() over (partition by Person order by EmployeeWhoKnowsPerson desc)
from Data
) as t
group by Person
哪个返回:
Person rowrank
John Smith 3
但是现在我正在考虑连接EmployeeWhoKnowsPerson列以返回,并想知道这怎么可能:
Person rowrank EmployeesWhoKnow
John Smith 3 Derek Jones, Adrian Daniels, Peter Low
对于SQL Server 2017 +
select
person,
count(*) as KnowsCount,
string_agg(EmployeeWhoKnowsPerson, ',') WITHIN GROUP (ORDER BY EmployeeWhoKnowsPerson ASC) AS EmployeesWhoKnowPerson
from
data
group by person;
对于以前的版本:
select
person,
count(*) as KnowsCount,
stuff((select ',' + EmployeeWhoKnowsPerson
from data as dd
where dd.Person = d.Person
order by EmployeeWhoKnowsPerson
for xml path('')), 1, 1, '') AS EmployeesWhoKnowPerson
from
data as d
group by person;
而且您想的太多了,谁都知道那一块。
这里是带有额外名称的SQL Fiddle Demo。
如果是2017年或以后,您可以在简单的分组依据中使用string_agg()
示例
Declare @YourTable Table ([Person] varchar(50),[EmployeeWhoKnowsPerson] varchar(50)) Insert Into @YourTable Values
('John Smith','Derek Jones')
,('John Smith','Adrian Daniels')
,('John Smith','Peter Low')
Select Person
,rowrank = sum(1)
,[EmployeeWhoKnowsPerson] = string_agg([EmployeeWhoKnowsPerson],', ')
From @YourTable
Group By Person
返回
Person rowrank EmployeeWhoKnowsPerson
John Smith 3 Derek Jones, Adrian Daniels, Peter Low
如果<2017 ...使用stuff()/ xml方法
Select Person
,rowrank = sum(1)
,[EmployeeWhoKnowsPerson] = stuff((Select ', ' + [EmployeeWhoKnowsPerson]
From @YourTable
Where Person=A.Person
For XML Path ('')),1,2,'')
From @YourTable A
Group By Person