Elijah

治愈系代码研究基地
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、一个例子看明白select语句的用法——查询本月通话总时长最多的前三个呼叫员的编号
先分析一下题目,这道题有几个限制条件,
首先是本月,这里要用时间函数,然后是总时长,要用聚合函数,之后是最多,需要用排序,最后是三个,用top。
搭出select...where...group by...order by...的框架。
首先,查询的目标是前三人的编号,还要显示总时长,就是:
select top 3 [CallerNumber],...... from CallRecords
总时长的话,可以这样取:
sum(datediff(ss,[StartDateTime],[EndDateTime]))
发现这里用到了聚合函数sum,那肯定要:
group by [CallerNumber]
既然查找的是本月,那就:
where datediff(month,[StartDateTime],'2010-07-1') = 0
最高的前三名一定是要排序的,所以
order by sum(datediff(ss,[StartDateTime],[EndDateTime])) desc

于是答案就是:
select top 3 [CallerNumber], sum(datediff(ss,[StartDateTime],[EndDateTime])) from CallRecords
group by [CallerNumber]
where datediff(month,[StartDateTime],'2010-07-1') = 0
order by sum(datediff(ss,[StartDateTime],[EndDateTime])) desc

二、一个例子看明白带返回参数的存储过程——登陆成功判断
声明:这种方法判断用户名密码正确与否很不科学,只是演示存储过程而已!
首先定义存储过程,传进来用户Id和密码,返回成功与否的bit值,然后定义一个usrCount计数变量,在数据库里找用户信息,如果找到了,则计数位1,否则为0。
create proc [dbo].[usp_CheckLogin]
    @loginId varchar(100),
    @loginPwd varchar(100),
    @isSuccess bit output
as
begin
    declare @usrCount int
    set @usrCount = (select count(*) from TblUser where loginId=@loginId and loginPwd=@loginPwd)
    if (@usrCount > 0)
        set isSuccess = 1;
    else
        set isSuccess = 0;
end
调用这个存储过程:
declare @isOK bit
exec usp_CheckLogin @loginId='用户名',@loginPwd='密码',@IsSuccess=@isOK output
可以通过这条语句查看结果:
print @isOK