在一个医药行业的系统中需要根据患者的接触记录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. SCU 4443 Range Query

    二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...

  2. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  3. socketserver用法列子

    socketserver socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端.即,每个客户端请求连接到服务器时,socket服务 ...

  4. [NOI2015]寿司晚宴 --- 状压DP

    [NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...

  5. [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1987  Solved: 791[Submit][Statu ...

  6. vmware10上三台虚拟机的Hadoop2.5.1集群搭建

    由于官方版本的Hadoop是32位,若在64位Linux上安装,则必须先重新在64位环境下编译Hadoop源代码.本环境采用编译后的hadoop2.5.1 . 安装参考博客: 1 http://www ...

  7. [转]Android学习笔记:TabHost 和 FragmentTabHost

    TabHost 命名空间: android.widget.TabHost 初始化函数(必须在addTab之前调用): setup(); 包含两个子元素: 1.Tab标签容器TabWidget(@and ...

  8. AtCoder Beginner Contest 022 A.Best Body 水题

    Best Body Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://abc022.contest.atcoder.jp/tasks/abc02 ...

  9. vue获取当前v-for里当前点击元素

    app.vue <template> <div id="app"> <ul > <li v-for="(item,index) ...

  10. paip.手机时间设置不能修改灰色禁用 解决大法

    paip.手机时间设置不能修改灰色禁用  解决大法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...