微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写SQL Server查询以显示以逗号分隔的子表列与父表联接

如何解决如何编写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

resultant query output should be as shown below

解决方法

根据建议,您可以在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

输出:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。