经常遇到统计报表中,子表记录合并为一个字段的情况。例如:省表中各省经济水平前五的城市统计。

有如下两表:dbo.省 和 dbo.市 (好吧,你可能会吐槽为什么用中文表名,其实我是为了方便查找替换)

这里暂时不考虑经济水平前五这种外部条件,期望将所有城市使用中文逗号拼接起来,如图:

具体做法如下:

--基于子表查询
SELECT
P.Name AS '省',
STUFF((SELECT ','+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS '市'
FROM dbo.市 C
LEFT JOIN dbo.省 P ON C.Parent = P.Code
GROUP BY C.Parent, P.Name
ORDER BY C.Parent --基于父表查询
SELECT
P.Name AS '省',
XC.City AS '市'
FROM dbo.省 P
LEFT JOIN(
SELECT
STUFF((SELECT ','+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS 'City',
Parent
FROM dbo.市 C GROUP BY C.Parent
) XC ON P.Code=XC.Parent
ORDER BY P.Code

这里有两种查询方式,基于子表会忽略没有下属城市的省记录,例如直辖市;而基于父表则会在子表集合列显示NULL值,两种情况分场景使用。

语法解释:

STUFF('STRING',1,1,'')

根据MSDN帮助,可以了解到,这是一个字符串替换函数,将参数1的字符串,从参数2位置(数据库索引通常从1开始,而不是0)开始截取,截取长度为参数3,截取的部分替换为参数4。

SELECT STATEMENT FOR XML PATH('')

这里的 SELECT STATEMENT 是常规查询语句,结果为xml集合,因此可以包括二维数据表。
但构建此查询的目的是为了拼接一维的数据,因此这里的查询语句通常只查询一个字段,并在字段前使用分隔符。示例中使用的分隔符为中文逗号。
具体的FOR XML PATH语法可以参考MSDN

转载请注明出自飞扬的尘埃的博客园

最新文章

  1. LAMP坏境和LNMP环境安装Nagios4.1.1和基本配置
  2. JQuery UI dialog 弹窗实例及参数说明
  3. AutoMapper之ABP项目中的使用介绍
  4. Eclipse debug断点调试代码时出现source not found问题
  5. java访问数据库的sql
  6. oracle工作经验(左右连接、decode)
  7. Mac下Apache Tomcat安装配置
  8. 精美jQuery插件及源码 前端开发福利
  9. 硝烟中的Scrum和XP-我们如何实施Scrum 15)多团队 Part 2/2 16)地理分散 17)检查列表 18)其他
  10. english 释词
  11. 日期控件My97DatePicker的使用
  12. ios 苹果手机硬件摘要
  13. iOS开发中UIPopoverController的使用详解
  14. resume
  15. shell脚本登录远程服务器并下载至本地
  16. Session&Cookie(Introduction、Application)
  17. Idea中配置Tomcat
  18. Linux系统中查找、删除重复文件,释放磁盘空间。
  19. SpringBoot+mybatis实现多数据源支持
  20. Node.js是什么[译]

热门文章

  1. Oracle 相关概念详解
  2. bzoj 3295 树套树
  3. 【BZOJ】【3907】网格
  4. CoreText 使用教程
  5. RMQ(st)
  6. Sqli-labs less 51
  7. 安装DirectX SDK (June 2010) 失败(Error Code S1023)(转)
  8. poj 3317 Stake Your Claim 极大极小搜索
  9. 妙味课堂——HTML+CSS(第二课)
  10. spring_150803_component