如何解决如何编写SQL Server查询以显示以逗号分隔的子表列与父表联接
我正在使用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
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。