起因¶

今天欧阳冰提出一个报表需求,其核心部分可以简化为这样一张表格:

调度单号 与调度单相关的多张作业单号
001 0001/0002/0003
002 0004
003 0005/0006/0007/0008

从上述表格可以看出,如何把调度单的多行作业单明细的单号合并到同一行的一个字段中,并用斜杠 / 分隔,是这个需求的难点。

解决¶

于是到网上去搜索了一下,有这样一篇文章:灵活运用 SQL SERVER FOR XML PATH
其中介绍了 SQL Server 数据库的 FOR XML PATH 关键字的用法。

在一句 SELECT 语句的最后加上 FOR XML PATH,就可以把整个结果数据集变成一个 xml 字符串。大家可以自行尝试一下。
而如果使用 FOR XML PATH(''),则是去除所有 xml 节点标记,只剩下原原本本的数据。我们要的就是这个。

于是,我们可以写 SQL:

SELECT DH.DH_DISPATCH_NO DISPATCH_NO, ( SELECT CLH.CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL, TM_CARGO_LOAD_H CLH WHERE DH.BILLID = DCLL.BILLID AND DCLL.DCLL_CARGO_LOAD_HEADER_ID = CLH.BILLID FOR XML PATH('') ) NOS
FROM TM_DISPATCH_H DH
GROUP BY DH.BILLID, DH.DH_DISPATCH_NO
;

这样就已经差不多了,但是多张作业单号这一列最后总是多个斜杠 /。

为了把最后这个斜杠去掉,我们还要使用一下 LEFT 函数。那么最终可以使用这样一句 SQL 来满足上述需求:

SELECT DISPATCH_NO, LEFT(NOS, LEN(NOS)-1) CARGO_LOAD_NOS
FROM ( SELECT DH.DH_DISPATCH_NO DISPATCH_NO, ( SELECT CLH.CLH_CARGO_LOAD_NO + '/' FROM TM_DISPATCH_CARGO_LOAD_L DCLL, TM_CARGO_LOAD_H CLH WHERE DH.BILLID = DCLL.BILLID AND DCLL.DCLL_CARGO_LOAD_HEADER_ID = CLH.BILLID FOR XML PATH('') ) NOS FROM TM_DISPATCH_H DH GROUP BY DH.BILLID, DH.DH_DISPATCH_NO ) TMP
ORDER BY DISPATCH_NO
;

转载于:https://www.cnblogs.com/suding1188/archive/2012/03/12/2391673.html

灵活运用 SQL Server 数据库的 FOR XML PATH相关推荐

  1. sql limit 子句_SQL Server中的FOR XML PATH子句

    sql limit 子句 As SQL professionals, we often have to deal with XML data in our databases. This articl ...

  2. SQL Server数据库字段类型详解

    1.字符串类型 Char char数据类型用来存储指定长度的定长非统一编码型的数据.当定义一列为此类型时,你必须指定列长.当你总能知道要存储的数据的长度时,此数据类型很有用.例如,当你按邮政编码加4个 ...

  3. Visual C# 2008+SQL Server 2005 数据库与网络开发--9.1.1 SQL Server 2005中的XML功能

    在SQL Server 2005中,对XML的支持已经集成到数据库本身的所有组件中,主要包括以下几方面. 支持XML格式的数据类型. 可以对XML格式的数据或者变量进行XQuery的查询. 增强了XM ...

  4. SQL SERVER 数据库邮件配置

    1.简单了解数据库邮件的概念和使用的传输协议及系统体系: 数据库邮件是从 SQL Server 数据库引擎中发送电子邮件的企业解决方案.通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件.邮件中 ...

  5. 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个...

    今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个 Failover Partner的选项.以前都没注意过,它的主要功能就是 ...

  6. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等

    Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...

  7. 使用PowerShell和Windows任务计划程序备份Linux SQL Server数据库

    This article is an in-depth guide on how PowerShell can be used to maintain and manage SQL backup on ...

  8. SQL Server数据库备份和还原报告

    In the previous articles, we discussed several ways of taking backup and testing the restore process ...

  9. Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档

    Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档 一.Debezium概述 二.SQL Server 连接器的工作原理 1.Snapshot ...

最新文章

  1. CentOS7 php7.0 升级到php7.3
  2. c语言自动生成版本号,单片机C程序自动产生并增加版本号
  3. C# DateTimePicker控件如何精确设置显示时分秒
  4. 记一次configuration wizard运行失败
  5. 软件性能-概念、关注点、术语
  6. 久游遭受重创的ng2b
  7. 掌握后可为孩子收藏的MySQL入门全套
  8. c语言 字符串 正序再倒序_python字符串
  9. cifs mount fail
  10. Linux用php上传表单文件,文件太大提示[413 Request Entity Too Large]
  11. 继承ActionSupport类
  12. 安装AdventureWorks2008R2示例数据库
  13. Quidway S系列交换机
  14. 局域网组网 | 交换机常用命令
  15. 为构建大型复杂系统而生的微服务框架 Erda Infra
  16. wp后台页面切换慢,打开速度慢:jquery-ui.min.css加载失败——在国外
  17. Win10玩方舟生存进化崩溃怎么办?
  18. 关于给hexo博客增加节日气氛主题切换(包括中国春节和圣诞节)
  19. JPA事务问题Executing an update/delete query
  20. 推荐微信小程序常用的几个UI组件库

热门文章

  1. Java并发编程(五):Java线程安全性中的对象发布和逸出
  2. [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
  3. poj 3090 amp;amp; poj 2478(法雷级数,欧拉函数)
  4. nginx配置反向代理解决前后端分离跨域问题
  5. codeforces——Little Pony and Expected Maximum
  6. 查看 PHP apache nginx mysql 是如何编译的
  7. 通向架构师的道路(第十七天)IBM Websphere集群探秘-WASND
  8. Ryu oslo学习总结
  9. OSCache-JSP页面缓存(2)
  10. linux中的umask 函数