第二篇 重要函数应用
1.行转列 (单列多行 转 单列一行)
说明: 单字段(列)多行转单列一行; --dbo.wg_getbrudt()
---多行日期时间转单行时间字符串
create table emptime (empno varchar(50),ddate datetime)
insert emptime
values('0001','2011-01-01 08:00:33')
insert emptime
values('0001','2011-01-01 09:06:000')
insert emptime
values('0001','2011-01-01 12:10:000')
insert emptime
values('0001','2011-01-01 15:20:000')
go
/*--定义行转列函数
alter FUNCTION dbo.wg_getbrudt(
@empno varchar(50), --员工工号
@ddate datetime --刷卡日期时间
)
RETURNS varchar(255)
as
begin
declare @Alltimes varchar(8000)
select @Alltimes= ( case when isnull(@Alltimes,'')='' then '' else @Alltimes+ ',' end )
+left(right(convert(varchar(50),a.ddate,121),12),5)
from emptime a
where a.empno=@empno and convert(char(10),a.ddate,121)=@ddate
--返回一行字符串
return isnull(@Alltimes,'')
end
*/
select left(right(convert(varchar(50),a.ddate,121),12),5) time,empno,ddate from emptime a
/*
time empno ddate
---------- ------- ----------------------------
08:00 0001 2011-01-01 08:00:33.000
08:00 0001 2011-01-01 08:00:33.000
09:06 0001 2011-01-01 09:06:00.000
12:10 0001 2011-01-01 12:10:00.000
15:20 0001 2011-01-01 15:20:00.000
*/
go
select '0001' empno, dbo.wg_getbrudt('0001','2011-01-01') as alltime --行转列函数应用
/*
empno alltime
----- ----------------------------------
0001 08:00,08:00,09:06,12:10,15:20
*/
drop table emptime
go
小结: 转字符串也是同样的方式. 关键在于此代码的执行效率,如果使用while方式循环拼接,效率很慢.
注意: 大数据量的情况下,可以对 emptime 表中 empno+ddate建立索引,则效率会更有保障.
备忘提示: 在合并字符串后,如果是全是英文字符串,则在单据中单元格中不会自动换行,如果要自换行则字符串加”中文全角逗号”区分,(字串中间有中文才能自动换行)如下图: