sql 行转列,如图所示是每个人每天的考勤打卡数据,怎样可以把每个人的刷卡时间横着显示
发布网友
发布时间:2022-05-19 23:00
我来回答
共4个回答
热心网友
时间:2023-10-19 19:12
如果是sqlserver你需要先建立一个函数像这样
CREATE FUNCTION [dbo].[JoinString]
(
@time varchar(100),
@name varchar(100)
)
RETURNS varchar(2000)
AS
BEGIN
DECLARE @tmp varchar(1000)
set @tmp=''
SELECT @tmp=@tmp+','+sj from (
select 人员姓名,CONVERT(varchar(100), 刷卡日期时间, 23) as rq,
CONVERT(varchar(100), 刷卡日期时间, 24) as sj
from 你的表名
)t
where 人员姓名 = @name and rq = @time
RETURN @tmp
END
然后就可以调用了,如下
select 人员姓名,rq,dbo.JoinString(rq,人员姓名) from
(
select 人员姓名,CONVERT(varchar(100), 刷卡日期时间, 23) as rq,
CONVERT(varchar(100), 刷卡日期时间, 24) as sj
from 你的表名
)t group by 人员姓名,rq
热心网友
时间:2023-10-19 19:12
;WITH a([name],rq,timeserial) AS (
SELECT N'name1','2016-09-01','8:20 11:20 18:54' union all
SELECT N'name2','2016-09-01','8:10 11:40 19:20' union all
SELECT N'name3','2016-09-01','8:20 12:10 18:34' union all
SELECT N'name4','2016-09-01','8:29 12:20 18:34 22:02'
)
SELECT * FROM (
SELECT a.name,a.rq
, CASE WHEN d.id=1 AND d.checkin>'7:30' AND d.checkin<='8:30' THEN d.checkin
WHEN d.id=2 AND d.checkin>'11:30' AND d.checkin<='12:30' THEN d.checkin
WHEN d.id IN(3,4) THEN d.checkin
ELSE '' END AS checkin
,CASE d.ID WHEN 1 THEN N'上班一' WHEN 2 THEN N'下班一' WHEN 3 THEN N'上班二' WHEN 4 THEN N'下班二' else N'其他' end as ty
FROM a
CROSS APPLY(SELECT a1.*,CONVERT(XML,'<n>'+REPLACE(a1.timeserial,' ','</n><n>')+'</n>') xtime FROM a AS a1 WHERE a1.name=a.name AND a1.rq=a.rq ) b
CROSS APPLY(SELECT ROW_NUMBER()OVER(PARTITION BY a.name,a.rq ORDER BY convert(int,replace(s.c.value('.','varchar(100)'),':',''))) AS ID
, s.c.value('.','varchar(100)') AS checkin FROM b.xtime.nodes('n')s(c)) d
) AS t
PIVOT(MAX(checkin) for ty IN (上班一,下班一,上班二,下班二,其他)) m
namerq上班一下班一上班二下班二其他
name12016-09-018:2018:54NULLNULL
name22016-09-018:1011:4019:20NULLNULL
name32016-09-018:2012:1018:34NULLNULL
name42016-09-018:2912:2018:3422:02NULL
热心网友
时间:2023-10-19 19:13
set @tmp=right(@tmp,len(@tmp)-1)
把第一个逗号去掉
热心网友
时间:2023-10-19 19:13
说下,我的想法吧, 首先 就是 根据 姓名和日期,来 group by, 日期要用一个函数,保证只有日期,不会加上具体的时间,而且,在group by 后面能不能使用函数,这点,我不确定。 然后用
GROUP_CONCAT 这个函数就行了。mysql是这样,别的我就不知道了。
不过,group_concat 只能生成一个字段。不知道符不符合你的要求。思路大概是这样,写不写的出来,我就不知道了。
GROUP_CONCAT 怎么用,自己去百度搜索。
我要贴地址,估计还得被你骂。顺便说下,百度知道上,大家帮助本就无可厚非,提个问,要求就别那么多了。追问sqlserver 中是没有这个函数的
追答http://blog.itnmg.net/sqlserver-group_concat/ 原谅我,我又要贴链接了