FOR XML PATH 应用及其反向分解
数据库环境:SQL SERVER 2005
我们实现将同一组的数据内容合并到一行的时候,可以通过FOR XML PATH来实现。
有数据如图1,要实现图2的效果
1.图1到图2的FOR XML PATH实现
网上有很多介绍FOR XML的方法,这里不再细说,感兴趣的朋友可以去查询一下它的用法。
--数据准备
;WITH x0
AS ( SELECT 1 AS id ,
'' AS ty
UNION ALL
SELECT 1 AS id ,
'' AS ty
UNION ALL
SELECT 2 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
)
/*实现*/
SELECT id ,
STUFF(ty, 1, 1, '') AS ty
FROM ( SELECT id ,
( SELECT ',' + x2.ty
FROM x0 x2
WHERE x2.id = x1.id
FOR
XML PATH('')
) AS ty
FROM x0 x1
GROUP BY id
) t
2.图2到图1的递归实现
从图2到图1,实现的方法不止递归一种方法,各位可以试着用其它方法解决。
/*准备数据*/
WITH x0
AS ( SELECT 1 AS id ,
'001,002' AS ty
UNION ALL
SELECT 2 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'004,1234' AS ty
UNION ALL
SELECT 4 AS id ,
'01,005,006' AS ty
),
x1 ( id, ty1, ty2 )
AS ( SELECT id ,
CASE WHEN CHARINDEX(',', ty, 1) > 0
THEN CONVERT(VARCHAR(10), LEFT(ty,
CHARINDEX(',', ty,
1) - 1))
ELSE ty
END AS ty1 ,--本次拆分字符
CASE WHEN CHARINDEX(',', ty, 1) > 0 THEN
STUFF(ty + ',', 1, CHARINDEX(',', ty), '')
ELSE NULL
END AS ty2--待拆分字符串
FROM x0
UNION ALL
SELECT id ,
CONVERT(VARCHAR(10), LEFT(ty2,
NULLIF(CHARINDEX(',', ty2, 1),
0) - 1)) AS ty1 ,--本次拆分字符
STUFF(ty2, 1, CHARINDEX(',', ty2), '') AS ty2--待拆分字符串
FROM x1
WHERE CHARINDEX(',', ty2, 1) > 0
)
SELECT id,ty1 AS ty
FROM x1 ORDER BY id
FOR XML PATH 应用及其反向分解的更多相关文章
- Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现
http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...
- for xml path 将单表中一个字段用逗号分隔
我也是才知道这种用法的,刚好又用到写个简单的例子. select Name from tc_order_detail 如下表,现在要将做到将name每个以逗号连接 declare @df nvarch ...
- SQL Server 2008 R2——使用FOR XML PATH实现多条信息按指定格式在一行显示
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- Sql Server FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- Sql Server 之 for xml (path,raw,auto,root)
1.for xml path('str') select ID,CreateTime from dbo.ArticleInfo for xml Path('mytitle') 结果:(注意:如果是s ...
- 灵活运用 SQL SERVER FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- 转王波洋,SQL语句中的 for XML Path('')
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- sqlserver -- 学习笔记(八)体验charindex、stuff 和 for xml path在实际问题中的应用及几个问题的探讨
写在前面 之前做了个微信端顾客扫码评价员工的功能,除了打分数,还可以打标签. 需要统计分数和统计各个员工每种标签被点击的次数. 后来加了个要求,需要查看客户对某个员工一次服务所打出的标签组合. 在不 ...
- 使用 SQL的 for xml path来进行字符串拼接 (group by)
参考: http://www.cnblogs.com/repository/archive/2011/01/18/1938418.html select convert(varchar(10),c.[ ...
随机推荐
- linux和Dos下换行符转换
一.windows的文件到linux下的转换方法: 1. 用sed命令替换 sed -e 's/^M//g' original.txt > target.txt (注意^M 在Linux/Uni ...
- HDU 1114 iggy-Bank(完全背包)
水 给出小猪钱罐的重量和装满钱后的重量,然后是几组数据,每组数据包括每种钱币的价值与重量 要求出重量最少能装满钱罐时的最大价值 #include<iostream> #include< ...
- Linux 下svn恢复到某一版本
经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看历史 ...
- Codeforces335B - Palindrome(区间DP)
题目大意 给定一个长度不超过5*10^4的只包含小写字母的字符串,要求你求它的回文子序列,如果存在长度为100的回文子序列,那么只要输出长度为一百的回文子序列即可,否则输出它的最长回文子序列 题解 这 ...
- Laravel Quickstart
Installation Via Laravel Installer First, download the Laravel installer using Composer. composer gl ...
- JS正则表达式验证表单
一.解释一些符号相关的意义 1. /^$/ 这个是个通用的格式. ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 2. 里面输入需要实现的功能. ...
- 让delphi程序不受WINDOWS日期格式的影响
http://www.cnblogs.com/hnxxcxg/archive/2013/01/30/2882672.html 如果WINDOWS系统的短日期格式为“yyyy/m/d”,执行下面的代码会 ...
- URAL - 1736 - Chinese Hockey
题意:n支队伍打比赛,每2队只进行1场比赛,规定时间内胜得3分,败得0分,若是打到了加时赛,那么胜得2分,败得1分,给出n支队伍最后的总得分,问这个结果是否是可能的,是的话输出“CORRECT”及各场 ...
- mysql init_connect 参数的其他用处
http://blog.itpub.net/133735/viewspace-691196/ init_connect 是可以动态在线调整的,这样就有了一些其他的用处 经过测试init_conne ...
- mysql 学习心得 [学习]
http://www.cnblogs.com/lyhabc/p/3822267.html