sql 行转列,如图所示是每个人每天的考勤打卡数据,怎样可以把每个人的刷卡时间横着显示

要的效果是
姓名 日期 刷卡时间
李丽华 2015-08-26 08:20,08:20,11:54............
李丽华 2015-08-27 08:20,08:20,11:54............
.
.
.
范欣欣 2015-08-26 08:20,08:20,11:54............
范欣欣 2015-08-27 08:20,08:20,11:54............
.



不要给我什么链接地址学习的,我要具体的实现方法,谢谢

如果是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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-09-01
;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 duty
    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 duty IN (上班一,下班一,上班二,下班二,其他)) m



name rq 上班一 下班一 上班二 下班二 其他

name1 2016-09-01 8:20 18:54 NULL NULL

name2 2016-09-01 8:10 11:40 19:20 NULL NULL

name3 2016-09-01 8:20 12:10 18:34 NULL NULL

name4 2016-09-01 8:29 12:20 18:34 22:02 NULL

第2个回答  2017-12-23
set @tmp=right(@tmp,len(@tmp)-1)
把第一个逗号去掉
第3个回答  2015-10-13
说下,我的想法吧, 首先 就是 根据 姓名和日期,来 group by, 日期要用一个函数,保证只有日期,不会加上具体的时间,而且,在group by 后面能不能使用函数,这点,我不确定。 然后用
GROUP_CONCAT 这个函数就行了。mysql是这样,别的我就不知道了。
不过,group_concat 只能生成一个字段。不知道符不符合你的要求。思路大概是这样,写不写的出来,我就不知道了。
GROUP_CONCAT 怎么用,自己去百度搜索。
我要贴地址,估计还得被你骂。顺便说下,百度知道上,大家帮助本就无可厚非,提个问,要求就别那么多了。追问

sqlserver 中是没有这个函数的

追答

http://blog.itnmg.net/sqlserver-group_concat/ 原谅我,我又要贴链接了