针对row_number()或类似功能的连接名

问题描述 投票:0回答:2

我的数据为人与人之间的个人关系重复了一行。例如,以下陈述约翰·史密斯(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
tsql concat
2个回答
0
投票

对于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


0
投票

如果是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
© www.soinside.com 2019 - 2024. All rights reserved.