问题描述
我正在使用sql Server数据库,该数据库具有如下定义的表。我需要编写一个T-SQL查询,以显示用逗号分隔的子表列与父表的联接。
父表
pid pname
------------
p1 Ana
p2 Bana
p3 Cana
子表
Cid pid cname gender
-------------------------------------
c1 p1 AAA-Ana M
c2 p1 BBB-Ana M
c3 p1 CCC-Ana F
c4 p2 MMM-Bana M
c5 p2 NNN-Bana M
c6 p3 RRR-Cana F
c7 p3 SSS-Cana F
c8 p9 ZZZ-orphan-child M
解决方法
根据建议,您可以在SQL Server 2017及更高版本中对String_agg和Case使用以下查询。
SELECT A.PID,A.pname,STRING_AGG( CASE WHEN GENDER = 'M' THEN [cname] END,',') WITHIN GROUP(ORDER BY B.CID) CNAME_MALE,STRING_AGG( CASE WHEN GENDER = 'F' THEN [cname] END,') WITHIN GROUP(ORDER BY B.CID) CNAME_FEMALE,COUNT(CASE WHEN [gender] = 'M' THEN 1 END) AS MALE_COUNT,COUNT(CASE WHEN [gender] = 'F' THEN 1 END) AS FEMALE_COUNT
FROM TABLE_PARENT A INNER JOIN Table_child B
ON(A.PID = B.PID) GROUP BY A.PID,A.pname order by a.pid;
,
您可以加入表格,然后按pid和pname进行分组计数,这将为您带来收益。对于字符串连接,我喜欢使用stuff函数:
select P.pid,P.pname,cname_Male = (stuff((Select ',' + cname
from childTable
where pid = P.pid and gender = 'M'
for xml path ('')),1,2,'')),cname_Female = (stuff((Select ',' + cname
from childTable
where pid = P.pid and gender = 'F'
for xml path ('')),MaleCount = (Select count(1) From childTable where pid = P.pid and gender = 'M'),FemaleCount = (Select count(1) From childTable where pid = P.pid and gender = 'F')
from parentTable P
Join childTable C ON C.pid = P.pid
group by P.pid,P.pname
输出: