在一个医药行业的系统中需要根据患者的接触记录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. office2016破解激活安装

    昨天一室友装office2016不会激活,[嘲讽脸]真的是笨啊.我这是在一个社区论坛里面找到的. 在网上找了教程,有些没用的,所以记录安装教程以便之后查看.以下的安装激活亲测有效(2017-4-28) ...

  2. pycharm的安装教程及大坑

    在根据网上的教程创建新工程后,发现不能调用第三方库,网上大多给的是print('hello world'),己适python解释器用的pycharm默认的也不能发现错误.后来浏览了一篇文章才恍然大悟, ...

  3. Java 读取目录下的所有文件

    package util; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apa ...

  4. 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  5. Ocelot网关统一查看多个微服务asp.net core项目的swagger API接口

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.准备 前提需要下载安装consul,项目需要懂添加swagger 统一在网关中配置多个微服务的swagger,需要用到服务注册 ...

  6. 「SCOI2016」美味

    「SCOI2016」美味 题目描述 一家餐厅有 \(n\) 道菜,编号 \(1 \ldots n\) ,大家对第 \(i\) 道菜的评价值为 \(a_i \:( 1 \leq i \leq n )\) ...

  7. [SimpleOJ236]暴风雨

    题目大意: 给你一棵n个点的树,以及m+q条信息. m条描述点a到b有边直接相连. q条描述点a和点b的LCA为c. 问有多少符合条件的以1为根的树. 思路: 状压DP. e[i]记录需要与点i直接相 ...

  8. HDU 4183

    给出一个有向图,以及src和dst.判断是否存在从src到dst的两条路径,使得除了src和dst外,没有其它点同时属于两条路径. 给每个点一个为1的点容量(src和dst为2),边的容量也是1,然后 ...

  9. ES查询

    (1)简单查询 1)根据id查询 get http://39.98.224.229:9200/company/data_info/AWnNz-AuWR2RitGomoXH 2)根据条件查询 查询所有数 ...

  10. URAL 1997 Those are not the droids you're looking for 二分图最大匹配

    Those are not the droids you're looking for 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=1 ...