SQL Server合并列值

说明:由于考勤系统中出来的打卡记录是按照工号,打卡日期,打卡时间以行的方式来显示的,现在需要按照工号,打卡日期来整理每个人每天的打卡时间


数据库表结构如下:

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

结果如下图:




2 .SQL Server2005及以上处理方法:

利用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


STUFF函数说明

1、作用
STUFF()函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符
2、语法
STUFF ( character_expression , start , length ,character_expression )
3、示例
以下示例在第一个字符串 123456789 中删除从第 2 个位置(字符 2)开始的三个(234)字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串


SELECT STUFF('123456789', 2, 3, 'abcedf')

下面是结果集
1abcedf56789
4、参数
character_expression
一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列

你可能感兴趣的:(SQL,SERVER)