在做一些视图,报表或者查询的时候,列转行是必须要做的,甚至有多列要转。
SQLSERVER中实现 基本思路是这样的
1 查出所需要数据放在视图1中,且在同一行中将第一次要转的字符串拼成1个长字符串;用+,相当于ORC的||
2 创建一个合并函数1 ,作用是动态SQL将在视图1中同一列中满足条件的字符串再拼成一个长字符串
3 调用这个合并函数1,将第一次列转行的数据存成视图2,同时也可将第二次列转行的同一行中要转的字符串拼成1个长字符串
4 创建一个合并函数2 ,作用是动态SQL将在视图1中同一列中满足条件的字符串再拼成一个长字符串
5 调用这个合并函数1,将第一次列转行的数据存成视图3...
以此类推...
注意:如果数据中有空值得话,用函数转换的时候会报substring 传递值错误。所以对于有空置的列,需要用isnull 判断赋值
可能上面的描述有点拗口,其实对于 SQL多列转行,先可以对现有数据分成几个大列,每次写一个合并函数,对其中的一个大列进行列转行操作。
操作后的数据,再针对其写第二个合并函数,继续对另外的大列进行列转行。直到满足要求为止。
我所找到的办法 基本思路就是这样了,感觉貌似是个笨办法。
很久没碰ORC了,不知道ORC有没有更好的办法。
上段代码,举个小例
--sql server 2000中的写法.
create table tb(name varchar(10), work varchar(10), startime int, endtime int , remark varchar(20))
_insert into tb values('张三', '程序员' , 1 , 3,'小伙子不错')
_insert into tb values('张三', '程序员' , 2 , null,'小伙子不错')
_insert into tb values('张三', '程序员' , 3 , null,'小伙子不错')
_insert into tb values('李四', '项目经理', 5 , null,'有前途')
_insert into tb values('李四', '项目经理', 7 , 10,'有前途')
_insert into tb values('王五', '技术总监', 10, null,'真棒')
go
--创建一个合并的函数
create function f_hb(@name varchar(10),@work varchar(10), @remark varchar(20))
returns varchar(8000)
as
begin
_declare @str varchar(8000)
set @str = ''
_select @str = @str + ',' + cast(time as varchar) from
(
_select name,work,remark,time = case when endtime is not null then cast(startime as varchar) + '-' + cast(endtime as varchar) else cast(startime as varchar) end from tb
) t
where name = @name and work = @work and remark = @remark
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
_select distinct name ,work ,remark ,dbo.f_hb(name ,work ,remark) as time from tb
/*
name work remark time
---------- ---------- -------------------- ------------------
李四 项目经理 有前途 5,7-10
王五 技术总监 真棒 10
张三 程序员 小伙子不错 1-3,2,3
分享到:
相关推荐
sql列转行以及行转列的通用存储过程!mssqlserver版本!
SQL 列转行 能直接运行
SQL通过一个存储过程将一列数据转换成几列数据,本人亲测,效果很好
SQL列转行的方法 介绍的是两种列转行的方法。简单易懂...
可以把一列转成一行…… 分隔符默认为英文逗号,也可以转成INSERT 中VALUES()后面的单引号加逗号...以前用T-SQL时,总是把一列复制到EXCEL中,转置,然后复制到记本事中,把一空格替换成逗号……,这个工具可以直接搞定
sql列转行用法实例,动静态脚本.适合新手学习
SQL行专列列转行的存储过程 很实用的 SQL行专列列转行的存储过程 很实用的
SQL Server 列转行代码,供大伙参考
Sql语句实现表的行列转换,行转列,列转行
SqlServer列转行的另一种方式!
sql 行转列 与列转行,oracle ,msssql等,详细数据库操作方法,各种例子,欢迎大家学习。、~
sql2005列转行存储过程代码,此代码分静态列表列转行和动态列表列转行,本代码在sql2005上测试通过。
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
sqlserver使用UNPIVOT函数列转行
Mysql 行转列,列转行 SQL语句和示例表结构SQL Mysql 行转列,列转行 SQL语句和示例表结构SQL
sql行转列_列转行问题.
有case when方式和2005之后的内置pivot和unpivot方法来实现,行列互转,可以分为静态互转,动态互转。
SqlServer如何进行行转列和列转行方法
精典的SQL语句。行转列,列转行的语句精典的SQL语句。行转列,列转行的语句
HANA SQL参考手册