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

要的效果是姓名日期刷卡时间李丽华2015-08-2608:20,08:20,11:54............李丽华2015-08-2708:20,08:20,11:54... 要的效果是
姓名 日期 刷卡时间
李丽华 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............
.



不要给我什么链接地址学习的,我要具体的实现方法,谢谢
展开
 我来答
百度网友022523ba3
推荐于2018-05-11 · TA获得超过678个赞
知道小有建树答主
回答量:416
采纳率:100%
帮助的人:255万
展开全部

如果是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
尚子素
2016-09-01 · TA获得超过600个赞
知道小有建树答主
回答量:566
采纳率:33%
帮助的人:204万
展开全部
;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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2017-12-23
展开全部
set @tmp=right(@tmp,len(@tmp)-1)
把第一个逗号去掉
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
459402930
2015-10-13 · TA获得超过444个赞
知道小有建树答主
回答量:292
采纳率:83%
帮助的人:182万
展开全部
说下,我的想法吧, 首先 就是 根据 姓名和日期,来 group by, 日期要用一个函数,保证只有日期,不会加上具体的时间,而且,在group by 后面能不能使用函数,这点,我不确定。 然后用
GROUP_CONCAT 这个函数就行了。mysql是这样,别的我就不知道了。
不过,group_concat 只能生成一个字段。不知道符不符合你的要求。思路大概是这样,写不写的出来,我就不知道了。
GROUP_CONCAT 怎么用,自己去百度搜索。
我要贴地址,估计还得被你骂。顺便说下,百度知道上,大家帮助本就无可厚非,提个问,要求就别那么多了。
追问
sqlserver 中是没有这个函数的
追答
http://blog.itnmg.net/sqlserver-group_concat/   原谅我,我又要贴链接了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式