日期:2014-05-18  浏览次数:20687 次

将满足条件的行,进行分组并将其中一列的字符串数据进行合并。
建立表如下:
CREATE TABLE [dbo].[A世界8月原始考勤$](
[人员编号] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[姓名] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[考勤日期] [nvarchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[考勤记录核算] [float] NULL,
[迟到] [float] NULL,
[早退] [float] NULL,
[早晨未打卡] [float] NULL,
[下午未打卡] [float] NULL
) ON [PRIMARY]

select 人员编号,姓名
,sum([001]) as 迟到
from dbo.考勤记录明细$
group by 人员编号,姓名
想通过查询实现如下所示:
员工编码 姓名 考勤次数 迟到次数 迟到日期
DY31721 蔡青 24.5 3 2011-08-11,2011-08-19,2011-08-31
DY31722 刘青 23.5 1 2011-08-11
DY31723 马伶 21.5 2 2011-08-11,2011-08-30
实现思路
select 人员编号,姓名,sum(迟到) as 迟到次数 from 考勤表
DECLARE @str varchar(8000)  
SET @str = ''  
SELECT 人员编号,姓名,
@str = @str + ',' + 考勤日期 FROM dbo.A世界8月原始考勤$ 
WHERE 迟到<>0
group by 人员编号,姓名
大概思路是这样,但sql无法实现向变量赋值的 SELECT 语句不能与数据检索操作结合使用。
常规如sum,count()这种函数可以用来做分类汇总,但是系统不存在字符传连接汇总这种函数,自己如何写一个?或者如何实现以上的查询报表






------解决方案--------------------
try:
SQL code
select 人员编号,姓名,sum(考勤记录核算)考勤次数,SUM(case when 迟到=1 then 1 else 0 end)迟到次数,
stuff((select ','+CONVERT(varchar(10),考勤日期,120) from tb where 迟到=1 and 人员编号=a.人员编号 for xml path('')),1,1,'')
from tb a group by 人员编号,姓名

------解决方案--------------------
SQL code
select
 人员编号,姓名,count(考勤记录核算)考勤次数,
 SUM(case when 迟到=1 then 1 else 0 end)迟到次数,
 stuff((select ','+CONVERT(varchar(10),考勤日期,120) from tb where 迟到=1 and 人员编号=a.人员编号 for xml path('')),1,1,'')
from
 tb a 
group by
 人员编号,姓名