关于SQL 行转列的办法
公司实施小姑娘要我写一个SQL给她
需求如下:
现在有表A,字段 id code parentid backres,现数据如下
id code parentid backres 1 A 5 2 B 5 3 C 5 4 D 5 5 E 6 6 F
我想得到的是
id code parentid backres 1 A 5 B;C;D; 2 B 5 A;C;D; 3 C 5 A;B;D; 4 D 5 A;B;C; 5 E 6 6 F
意思是,根据Parentid得到ABCD都属于E,然后将ABCD的Backres改为,A;B;C;D;,减去它们本身 我做了一个很笨的办法 用游标遍历 再用参数存值 sql如下
create table #temp
(
Code nvarchar(50),
BackCode nvarchar(4000)
)
declare cursor1 cursor
for select Id,Code,parentid from Master_ResourceUnit where parentid is not null
open cursor1
DECLARE @Id nvarchar(100)
DECLARE @Code nvarchar(100)
DECLARE @Parentid nvarchar(100)
while @@FETCH_STATUS=0
begin
print @id
DECLARE @combinedString nvarchar(4000)
set @combinedString=''
select @combinedString=@combinedString+Code+';' from Master_ResourceUnit where ParentId =@Parentid and Code<>@code
insert #temp (Code,BackCode) values(@Code,@combinedString)
print @combinedString
fetch next from cursor1 into @id,@code,@Parentid
end
close cursor1
deallocate cursor1
效果是有的不过还是太笨了
结果她百度提问了 得到的解决办法如下:
--建表
Create
Table
T
(
id
int
,
code
Varchar
(10),
parentid
int
,
backres
Varchar
(10)
)
--插入数据
insert
into
T
values
(1,
'A'
, 5,
''
)
insert
into
T
values
(2,
'B'
, 5,
''
)
insert
into
T
values
(3,
'C'
, 5,
''
)
insert
into
T
values
(4,
'D'
, 5,
''
)
insert
into
T
values
(5,
'E'
, 6,
''
)
insert
into
T
values
(6,
'F'
, 0,
''
)
--更新(按parentid把code按分号拼接,然后替换掉本身)
Update
T
Set
backres=
Replace
((
Select
code+
';'
From
T A
Where
T.parentid=A.parentid
For
Xml Path(
''
)
),code+
';'
,
''
)
--查看结果
Select
*
from
T
关于SQL 行转列的办法的更多相关文章
- SQL 行转列和列转行
SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...
- Ms sql行转列。汇总
SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 ...
- sql 行专列 列转行 普通行列转换
转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换 ...
- sql 行转列 PIVOT 列转行 UNPIVOT
原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 ...
- sql 行转列总结
原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- SQL行转列 (及EAV模型获取数据)
参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列. ...
- SQL行转列,列转行
SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...
- sql 行转 列, 列转行
行列互转 复制代码 create table test(id ),quarter int,profile int) insert into test values(,,) insert into te ...
- SQL行转列和列转行
行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和 ...
随机推荐
- [java][jboss]改变jboss部署目录(虚拟目录)
原文: [java][jboss]改变jboss部署目录(虚拟目录) 在开发过程中,有时候我们希望将程序放在我们的源代码目录中,比如d:\code下,而不是放在jboss的deploy下,怎么办? 我 ...
- 【洛谷】2602: [ZJOI2010]数字计数【数位DP】
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...
- mysql长连接
长连接是干嘛的: 它是做连接复用的: 在openresty中的lua-resty-mysql 里 connect方法去连接mysql时会去ngx_lua cosocket连接池中寻找是否有可用连接 ...
- 【JavaScript代码实现二】通用的事件侦听器函数
// event(事件)工具集,来源:github.com/markyun markyun.Event = { // 页面加载完成后 readyEvent : function(fn) { if (f ...
- 机器学习(1):Logistic回归原理及其实现
Logistic回归是机器学习中非常经典的一个方法,主要用于解决二分类问题,它是多分类问题softmax的基础,而softmax在深度学习中的网络后端做为常用的分类器,接下来我们将从原理和实现来阐述该 ...
- Spring @Value 用法小结,#与$的区别
20161016更新:这货其实是SpEL的功能,来这里看看吧: Spring 4 官方文档学习(五)核心技术之SpEL 起因 一直的用法是 @Value("${jdbc.driverClas ...
- 【我所认知的BIOS】—> uEFI AHCI Driver(5) — 第一个protocol最终要開始安装了
[我所认知的BIOS]-> uEFI AHCI Driver(5) - 第一个protocol最终要開始安装了 LightSeed 4/28/2014 文章对EFI_DRIVER_BINDING ...
- [Go] 复合类型(数组、切片、字典、结构体)变量的 初始化 及 注意事项
Go变量 初始化 对 复合类型(数组.切片.字典.结构体)变量的初始化是,有一些语法限制: 1.初始化表达式必须包含类型标签: 2.左花括号必须在类型尾部,不能另起一行: 3.多个成员初始值以逗号分隔 ...
- Thinkpad T440p安装Linux的种种问题(by quqi99)
作者:张华 发表于:2014-05-08 版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) Thi ...
- MVC实现文件下载
□ 思路 点击一个链接,把该文件的Id传递给控制器方法,遍历文件夹所有文件,根据ID找到对应文件,并返回FileResult类型. 与文件相关的Model: namespace MvcApplicat ...