说明:由于考勤系统中出来的打卡记录是按照工号,打卡日期,打卡时间以行的方式来显示的,现在需要按照工号,打卡日期来整理每个人每天的打卡时间
数据库表结构如下:
CREATE TABLE [dbo].[CardInfo](
[CardId] [nvarchar](255) NULL,
[UserName] [nvarchar](255) NULL,
[DepartName] [nvarchar](255) NULL,
[LoginDate] [date] NULL,
[LoginTime] [varchar](5) NULL
) ON [PRIMARY]
1.SQL Server2000处理方法:
通过函数来处理
CREATE FUNCTION [dbo].[F_GetDateTime](@CardId varchar(60),@LoginDate date)
RETURNS VARCHAR(1000)
BEGIN
DECLARE @STR VARCHAR(1000)
SET @STR = ''
SELECT @STR = @STR +' '+LoginTime FROM CardInfo A WHERE A.CardId = @CardId AND LoginDate = @LoginDate
SET @STR = STUFF(@STR,1,1,'')
RETURN @str
END
SELECT *,dbo.F_GetDateTime(A.CardId,A.LoginDate) AS LoginTime FROM(
SELECT DISTINCT CardId ,
UserName ,
DepartName ,
LoginDate
FROM CardInfo A) A
结果如下图:
利用FOR XML PATH的方式来实现
方法一:
SELECT DISTINCT CardId ,
UserName ,
DepartName ,
LoginDate ,
STUFF((SELECT ' '+LoginTime FROM CardInfo B WHERE A.CardId = B.CardId
AND A.LoginDate = B.LoginDate FOR XML PATH('')),1,1,'') AS LoginTime
FROM CardInfo A
ORDER BY A.CardId ,LoginDate
方法二:
SELECT A.CardId ,
A.UserName ,
A.DepartName ,
A.LoginDate ,
STUFF((SELECT ' '+B.LoginTime FROM CardInfo B WHERE A.CardId = B.CardId AND A.LoginDate = B.LoginDate FOR XML PATH('')),1,1,'') AS LoginTime
FROM CardInfo A
GROUP BY A.CardId,A.UserName,A.DepartName,A.LoginDate
1、作用
STUFF()函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符
2、语法
STUFF ( character_expression , start , length ,character_expression )
3、示例
以下示例在第一个字符串 123456789 中删除从第 2 个位置(字符 2)开始的三个(234)字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串
SELECT STUFF('123456789', 2, 3, 'abcedf')