一个复杂的统计活跃在线用户的问题SQL语句[问题点数:100分,结帖人:loveisfrom]
楼主发表于:2011-10-25 13:21:53
在表 user 中有 三个字段分别为:user_id(用户id)、user_login_time(登录时间)、user_long_exit(退出时间)
实现功能为:统计5天内的用户在线时间大于10小时的用户(不要重复字段)。比如(10月1日——10月4日)
注:用户每次登录、退出都会有记录的。
declare @startdate datetime,@enddate datetime
set @startdate='2011-10-01 00:00:00'
set @enddate='2011-10-04 23:59:59'
select
user_id,
sum(datediff(s,user_login_time,user_long_exit)) as 在线时间(秒)
from [user]
where user_login_time between @startdate and @enddate
group by user_id
having sum(datediff(s,user_login_time,user_long_exit))>36000
有数据表,数据结果如下所示:
ID Name ParentID
1 办公管理 0
2 系统管理 0
3 加班 1
4 报销 1
5 流程管理 2
现需将内容排列为:
ID Name ParentID
1 办公管理 0
3 加班 1
4 报销 1
2 系统管理 0
5 流程管理 2
从CSDN上知三种方式:
CREATE TABLE module
(
ID int primary key,
[Name] nvarchar(50),
ParentID int
)
GO
INSERT INTO [DB_Test].[dbo].[module]([ID],[Name],[ParentID])
VALUES(1,'办公管理',0)
INSERT INTO [DB_Test].[dbo].[module]([ID],[Name],[ParentID])
VALUES(2,'系统管理',0)
INSERT INTO [DB_Test].[dbo].[module]([ID],[Name],[ParentID])
VALUES(3,'加班',1)
INSERT INTO [DB_Test].[dbo].[module]([ID],[Name],[ParentID])
VALUES(4,'报销',1)
INSERT INTO [DB_Test].[dbo].[module]([ID],[Name],[ParentID])
VALUES(5,'流程管理',2)
GO
--1.
select *,convert(varchar(10),ParentID)+','+convert(varchar(10),ID) as NodePath from Module where ParentID=0
union
select *,'0,'+convert(varchar(10),ParentID)+','+convert(varchar(10),ID) as NodePath from Module where ParentID<>0
order by NodePath
结果为:
ID Name ParentID NodePath
----------- -------------------------------------------------- ----------- -----------------------
1 办公管理 0 0,1
3 加班 1 0,1,3
4 报销 1 0,1,4
2 系统管理 0 0,2
5 流程管理 2 0,2,5
--2.
select * from (
select id, name, parentid,
case when parentid = 0 then id else parentid end as myorder1,
case when parentid = 0 then 0 else 1 end as myorder2 from module
)
table1 order by myorder1 , myorder2
结果为:
id name parentid myorder1 myorder2
----------- ------------------------ -----------
1 办公管理 0 1 0
3 加班 1 1 1
4 报销 1 1 1
2 系统管理 0 2 0
5 流程管理 2 2 1
--3.
CREATE PROC PROC_Model
AS
DECLARE @RESULT TABLE (ID INT, [Name] nvarchar(50),ParentID int)
DECLARE @ParentId int
SELECT @ParentId=MIN(Id) FROM module WHERE ParentId=0
WHILE(@ParentId>0)
BEGIN
PRINT @ParentId
INSERT INTO @RESULT
SELECT * FROM module WHERE ID=@ParentId UNION
SELECT * FROM module WHERE ParentID=@ParentId
SELECT @ParentId=MIN(ID) FROM module WHERE ParentId=0 AND Id>@ParentId
END
SELECT * FROM @RESULT
EXEC PROC_Model
结果为:
ID Name ParentID
----------- -------------------------------------------------- -----------
1 办公管理 0
3 加班 1
4 报销 1
2 系统管理 0
5 流程管理 2