在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样
 
 
--患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录
IF OBJECT_ID ('dbo.TEST') IS NOT NULL
DROP TABLE dbo.TEST
GO
CREATE TABLE dbo.TEST
(
ID INT IDENTITY (1000,1) NOT NULL,
cid INT,--接触记录号
REMARK VARCHAR (4000),
CONTACTTYPE VARCHAR (20),
DESCRIBE VARCHAR (4000),
ADDDATE DATETIME
)
GO
--测试数据,包含重复类型
INSERT INTO dbo.TEST (cid, REMARK, CONTACTTYPE, DESCRIBE, ADDDATE)
VALUES (81667,'咨询备注','ContactType_1', NULL,'2014-06-03 09:53:24')
,(81667,'回访备注','ContactType_2', NULL,'2014-06-03 09:53:24')
,(81667,'咨询备注','ContactType_1', NULL,'2014-06-03 09:53:24.92')
,(81667,'回访备注','ContactType_2','回访找棕','2014-06-03 09:53:24.927')
,(81667,'随访备注','ContactType_3','随访详情','2014-06-03 09:53:24.933')
,(81667,'通知备注','ContactType_4','通知内容描述','2014-06-03 09:53:24.94')
,(81667,'预约备注','ContactType_5','预约内容','2014-06-03 09:53:24.947')
,(81667,'回复备注','ContactType_6','回复测试。。。。','2014-06-03 09:53:24.95')
,(81679,'咨询备注','ContactType_1', NULL,'2014-06-03 10:53:53.743')
,(81679,'回访备注','ContactType_2','回访内容描述','2014-06-03 10:53:53.75')
,(81679,'随访备注','ContactType_3','随访详情','2014-06-03 10:53:53.757')
,(81679,'通知备注','ContactType_4','通知内容描述','2014-06-03 10:53:53.763')
,(81679,'预约备注','ContactType_5','预约内容','2014-06-03 10:53:53.767')
,(81679,'回复备注','ContactType_6','回复内容','2014-06-03 10:53:53.777')

之前写的一个Sql方法里是这样的在正常的情况下没有问题,但如果一个接触记录存在两个相同的接触类型的话就会存在相同的接触类型(此问题有可能是代码导致的,但我并不能直接更改代码)
既然不能更改代码那只能通过数据库来处理了
--之前的sql方法,有可以会返回相同的类型则
DECLARE @SNvarchar(2000)
SET @S=''
SELECT @S=@S+'/'+(CASE ContactType
WHEN 'ContactType_1'THEN '咨询'
WHEN 'ContactType_2'THEN '回访'
WHEN 'ContactType_3'THEN '随访'
WHEN 'ContactType_4'THEN '通知'
WHEN 'ContactType_5'THEN '预约'
WHEN 'ContactType_6'THEN '回复'
END)
FROM test WHERE CID=81667
PRINT @s
以下效果显然不是我想要的
 
 
通过几个小时的努力终于通过Sql完美解决,时间全部浪费在去重的问题上
想到过的解决方法
1.在之前Sql里直接加入DISTINCT进行数据去重但一直出现错误"关键字 'DISTINCT' 附近有语法错误。 Severity 15"
2.使用临时表,先将数据查询出来并插入临时表,然后再循环临时表并添加到字符串,添加时如果存在则不会重复添加
3.先按照原来的方法得到可能重复的字符串,然后对字符串进行去重处理
4.使用我现在的方法即用for xml和DISTINCT得到已经去重的字符串然后再赋予一个变量
 
FOR XML需要SqlServer 2005+版本支持

--新的Sql方法,通过FOR XML PATH和DISTINCT进行去重处理 

DECLARE @SNvarchar(2000)
--无法在包含DISTINCT关键字的查询中将结果赋予变量,以下Sql将出现错误"关键字 'DISTINCT' 附近有语法错误。 Severity 15"
-- SELECT @s= DISTINCT -- ( '/'+(CASE ContactType -- WHEN 'ContactType_1'THEN '咨询' -- WHEN 'ContactType_2'THEN '回访' -- WHEN 'ContactType_3'THEN '随访' -- WHEN 'ContactType_4'THEN '通知' -- WHEN 'ContactType_5'THEN '预约' -- WHEN 'ContactType_6'THEN '回复' -- END) -- ) -- FROM test WHERE Cid=81667 -- FOR XML PATH('')
SELECT @S=(
SELECT DISTINCT (
'/'+(CASE ContactType
WHEN 'ContactType_1'THEN '咨询'
WHEN 'ContactType_2'THEN '回访'
WHEN 'ContactType_3'THEN '随访'
WHEN 'ContactType_4'THEN '通知'
WHEN 'ContactType_5'THEN '预约'
WHEN 'ContactType_6'THEN '回复'
END)
)
FROM test WHERE Cid=81667
FOR XML PATH('')
)
PRINT @s
通过FOR XML和DISTINCT去重后的效果
 
 
可以看到使用for xml path可以很容易的将多选结果集转换成一行
 
参考:
 
 

来自为知笔记(Wiz)

使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理的更多相关文章

  1. 灵活运用 SQL SERVER FOR XML PATH 转

    灵活运用 SQL SERVER FOR XML PATH   FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些 ...

  2. SQL Server FOR XML PATH 语句的应用---列转行

    经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法.在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用 ...

  3. 问题:sqlserver有没有类似Oracle的LISTAGG;结果: 灵活运用 SQL SERVER FOR XML PATH

    灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前 ...

  4. SQL Server FOR XML PATH 和 STUFF函数的用法

    FOR XML PATH ,其实它就是将查询结果集以XML形式展现,将多行的结果,展示在同一行. 下面我们来写一个例子: 假设我们有个工作流程表: CREATE TABLE [dbo].[Workfl ...

  5. Sql Server FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  6. 灵活运用 SQL SERVER FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  7. Sql server For XML Path 学习

    最近看到太多人问这种问题   自己也不太了解  就在网上学习学习 自己测试一番 CREATE TABLE test0621 (id INT,NAME NVARCHAR(max)) INSERT tes ...

  8. Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAACWCAIAAABo2EyXAAAKeklEQVR4nO2dy27rNh7G+U7CFIrfZX

  9. SQL SERVER FOR XML PATH合并字符串

    两种方式,效率立竿见影 ------------------------------------------------ SET STATISTICS TIME ON DECLARE @OrderSt ...

随机推荐

  1. mac linux 命令笔记 - 权限管理

    壹 权限 在使用命令行工具时,可能需要临时切换到管理员/root权限,如何切换呢? 正文 进入 root 权限: sudo -i 提示输入密码,这个密码就是锁屏的解锁密码. 在操作完成之后,使用 ex ...

  2. TCP拥塞控制及连接管理

    在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制. 一.TCP拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion ...

  3. 记录一下最近犯得sb的翻车错误

    首先是: 数据范围是long long范围,然后写了一个暴力,觉得过不去,于是开了int范围,最后写了个能骗过所有数据的骗分,然后没开longlong... 接着是: for(int i = l; i ...

  4. 我的sublime text3 配置文件设置

    { "ignored_packages": [ "Vintage" ], //vim模式 "line_padding_bottom": 2, ...

  5. GC参数

    串行收集器 串行收集器(Serial),是一个相对比较老的回收器,但是它的效率在回收器中相对较好,并且比较稳定.他在进行垃圾回收的过程中,使得应用暂时被挂起,然后启用单条线程去做垃圾回收,所以在进行垃 ...

  6. PHP 笔记——操作MySQL数据库

    1. 连接MySQL服务器 ​ mysqli_connect :此函数是该函数的别名: mysqli::__construct() mysqli mysqli_connect ( [string se ...

  7. poj 2104 静态主席树

    我的第一道主席树(静态). 先记下自己对主席树的理解: 主席树的作用是用于查询区间第k大的元素(初始化nlog(n),查询log(n)) 主席树=可持续线段树+前缀和思想 主席树实际上是n棵线段树(由 ...

  8. 2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用

    D - 秋实大哥与战争 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...

  9. EM(Expectation Maximization)算法

    EM(Expectation Maximization)算法  参考资料: [1]. 从最大似然到EM算法浅解 [2]. 简单的EM算法例子 [3]. EM算法)The EM Algorithm(详尽 ...

  10. SVN 服务器搭建及使用 一

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...