如何在使用 group by 后将结果集合并为一行
How to combine a result set into one row after using group by
SQL脚本:
select can.Reference, can.CandidateID, can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant', sector.unitname from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
order by can.created desc
结果集:
Ref CanID CanName ConName Sector
Bob1 188435 Eve Evil Charlie Chaplin Nursery
Bob1 188435 Eve Evil Charlie Chaplin Private Schools
Bob1 188435 Eve Evil Charlie Chaplin Secondary
Bob1 188435 Eve Evil Charlie Chaplin SEN
在上面你可以看到返回了 4 个结果,如果有不止一个可以说的话,我希望如此:
Ref CanID CanName ConName Sector
Bob1 188435 Eve Evil Charlie Chaplin Nursery, Private Schools, Secondary, SEN
我如何实现上述目标?
使用员工
with YourTable as
(
select can.Reference, can.CandidateID, can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant', sector.unitname from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
)
SELECT
Ref,CanID,CanName,ConName,
STUFF((
SELECT ', ' + [Sector] + ',' + CAST([Value] AS VARCHAR(MAX))
FROM YourTable
WHERE (CanID = Results.CanID and Ref=Results.Ref and CanName=Results.CabName and ConName=Results.ConName)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS SectorValues
FROM YourTable Results
GROUP BY Ref,CanID,CanName,ConName
你可以尝试用STUFF
配合cte来制作
;with cte as(
select
can.Reference,
can.CandidateID,
can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant',
sector.unitname 'Sector'
from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
)
SELECT distinct
Reference,
CandidateID,
Candidate,
Consultant,
STUFF((
SELECT ','+ Sector
FROM cte tt
FOR XML PATH(''),TYPE ).value('.','VARCHAR(MAX)'),1,1,'')
FROM cte t1
SQL脚本:
select can.Reference, can.CandidateID, can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant', sector.unitname from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
order by can.created desc
结果集:
Ref CanID CanName ConName Sector
Bob1 188435 Eve Evil Charlie Chaplin Nursery
Bob1 188435 Eve Evil Charlie Chaplin Private Schools
Bob1 188435 Eve Evil Charlie Chaplin Secondary
Bob1 188435 Eve Evil Charlie Chaplin SEN
在上面你可以看到返回了 4 个结果,如果有不止一个可以说的话,我希望如此:
Ref CanID CanName ConName Sector
Bob1 188435 Eve Evil Charlie Chaplin Nursery, Private Schools, Secondary, SEN
我如何实现上述目标?
使用员工
with YourTable as
(
select can.Reference, can.CandidateID, can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant', sector.unitname from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
)
SELECT
Ref,CanID,CanName,ConName,
STUFF((
SELECT ', ' + [Sector] + ',' + CAST([Value] AS VARCHAR(MAX))
FROM YourTable
WHERE (CanID = Results.CanID and Ref=Results.Ref and CanName=Results.CabName and ConName=Results.ConName)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS SectorValues
FROM YourTable Results
GROUP BY Ref,CanID,CanName,ConName
你可以尝试用STUFF
配合cte来制作
;with cte as(
select
can.Reference,
can.CandidateID,
can.firstname + ' ' + can.surname AS 'Candidate',
con.firstname + ' ' + con.lastname as 'Consultant',
sector.unitname 'Sector'
from candidate can
inner join address ad on can.address = ad.addressid
inner join consultants con on con.consultantid = can.owningconsultant
inner join client cl on cl.ownedby = con.consultantid
inner join clientdata cd on cd.clientid = cl.clientid
inner join businessunits sector on sector.unitid = cd.ClientSectorID
where can.division = 1
and
can.OwningConsultant = 385
and
can.status in ('56','179')
group by can.Reference, can.CandidateID, can.FirstName, can.Surname, con.FirstName, con.LastName, can.Created, sector.unitname
)
SELECT distinct
Reference,
CandidateID,
Candidate,
Consultant,
STUFF((
SELECT ','+ Sector
FROM cte tt
FOR XML PATH(''),TYPE ).value('.','VARCHAR(MAX)'),1,1,'')
FROM cte t1