当前位置: 代码迷 >> Sql Server >> 求一条统计sql语句,该如何处理
  详细解决方案

求一条统计sql语句,该如何处理

热度:43   发布时间:2016-04-27 14:51:48.0
求一条统计sql语句
有user和task 2张表

想统计一个数据每天不重复的用户登入的次数和具体列表
user表 包括 taskID,UserName。
task表 包括 taskID,loginTime。
数据
user表
username taskID
张三 1
张三 2
张三 3
李四 4

task表
taskID loginTime 
1 2012-12-23 11:30:00
2 2012-12-23 18:30:00
3 2012-12-25 11:30:00
4 2012-12-23 11:00:00

结果按照天来显示,列名有 日期,人数和具体的username.
日期 人数 登入人
2012-12-23 2 张三,李四
2012-12-24 0 无
2012-12-25 1 张三

------解决方案--------------------
SQL code
;with f as(select  convert(varchar(10),b.loginTime,120) as 日期,isnull(count(distinct a.username),0) as 人数,a.username as 登入人from  user a left join task bon  a.taskID=b.taskID)select 日期,人数, [登入人]=stuff((select ','+[value] from f where 日期=t.日期 for xml path('')), 1, 1, '') from f t group by 日期,人数
------解决方案--------------------
SQL code
create table [user](username varchar(10),taskid int)insert into [user]select '张三',1 unionselect '张三',2 unionselect '张三',3 unionselect '李四',4create table task(taskid int,loginTime datetime)insert into taskselect 1,'2012-12-23 11:30:00' unionselect 2,'2012-12-23 18:30:00' unionselect 3,'2012-12-25 11:30:00' unionselect 4,'2012-12-23 11:00:00' declare @bdate datetime=(select min(loginTime) from task),        @edate datetime=(select MAX(loginTime) from task);with cte1 as(  select 日期=DATEADD(day,number,@bdate) from master.dbo.spt_values     where type='p' and number<=DATEDIFF(DAY,@bdate,@edate) ) ,cte2 as (   select a.username,b.loginTime from [user] a,task b where a.taskid=b.taskid ) select 日期,       人数=(select COUNT(distinct username) from cte2 where DATEDIFF(DAY,a.日期,loginTime)=0),       登入人=isnull(stuff((select distinct ','+username from cte2              where DATEDIFF(DAY,a.日期,loginTime)=0 for xml path('')),1,1,''),'无')from cte1 a      /*日期                      人数          登入人----------------------- ----------- -------------2012-12-23 11:00:00.000 2           李四,张三2012-12-24 11:00:00.000 0           无2012-12-25 11:00:00.000 1           张三
  相关解决方案