经典SQL语句汇总-1



一个复杂的统计活跃在线用户的问题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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值