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

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

  1. --新的Sql方法,通过FOR XML PATHDISTINCT进行去重处理
  2.  
  3. DECLARE @SNvarchar(2000)
  4. --无法在包含DISTINCT关键字的查询中将结果赋予变量,以下Sql将出现错误"关键字 'DISTINCT' 附近有语法错误。 Severity 15"
  5. -- 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('')
  6. SELECT @S=(
  7. SELECT DISTINCT (
  8. '/'+(CASE ContactType
  9. WHEN 'ContactType_1'THEN '咨询'
  10. WHEN 'ContactType_2'THEN '回访'
  11. WHEN 'ContactType_3'THEN '随访'
  12. WHEN 'ContactType_4'THEN '通知'
  13. WHEN 'ContactType_5'THEN '预约'
  14. WHEN 'ContactType_6'THEN '回复'
  15. END)
  16. )
  17. FROM test WHERE Cid=81667
  18. FOR XML PATH('')
  19. )
  20. 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. elementUI 学习入门之 input 输入框

    基础用法 <el-input v-model="input1" palcehoder="请输入"></el-input> var Mai ...

  2. 验证码无法显示:Could not initialize class sun.awt.X11GraphicsEnvironment 解决方案

    一.原因现象:图下图 二.原因导致: 经过Google发现很多人也出现同样的问题.从了解了X11GraphicEnvironment这个类的功能入手,一个Java服务器来处理图片的API基本上是需要运 ...

  3. Django+Nginx+uwsgi搭建自己的博客(五)

    在上一篇博文中,向大家介绍了Users App和Index的前端部分的实现,以及前端与Django的通信部分.至此,我们的博客已经具备一个简单的雏形,可以将其部署在本地的服务器上了.目前较为流行的we ...

  4. ssm demo,用户角色权限管理

    SSM框架整合 Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastjson 5, aspectwea ...

  5. 【BZOJ 2656】2656: [Zjoi2012]数列(sequence) (高精度)

    2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 1499  Solved: 786 Descri ...

  6. [BZOJ4196][NOI2015]软件包管理器(树链剖分)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2166  Solved: 1253[Submit][Sta ...

  7. HashMap结构及使用

    HashMap的数据结构 HashMap主要是用数组来存储数据的,我们都知道它会对key进行哈希运算,哈系运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表来解决的.在HashMap里有这 ...

  8. slf4j使用

    pom jar包引用<!-- Logging --> <dependency> <groupId>ch.qos.logback</groupId> &l ...

  9. 解决新版本webpack vue-cli生成文件没有dev.server.js问题

    新版本webpack生成的dev.server.js 在webpack.dev.conf.js中 webpack.dev.conf.js const axios = require('axios') ...

  10. 'NSUnknownKeyException', reason:....etValue:forUndefinedKey:]: this class is not key value coding-compliant for the key

    erminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainTableViewControl ...