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
    <span style="font-family: Arial, Helvetica, sans-serif;">        SET @STR = STUFF(@STR,1,1,'')</span>
	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 可以是常量、变量,也可以是字符列或二进制数据列

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值