1.申明一个表变量
- ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]AS
- BEGIN
- DECLARE @resultTemp TABLE(UserID INT,DealCustomerCount INT) --申明表变量
- INSERT INTO @resultTemp --往表变量添加数据
- SELECT UserID,COUNT(DISTINCT TempCustomerID) AS DealCustomerCount
- FROM CRM_Log_CheckTempCustomer
- GROUP BY UserID
- ORDER BY UserID;
- END
2.表变量添加自增序列。
- ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]AS
- BEGIN
- DECLARE @result TABLE(UserID INT,DealCustomerCount INT,Serial INT)--添加Serial字段作为自增序列
- INSERT INTO @result --ROW_NUMBER() OVER(ORDER BY UserID) 按UserID排序由1开始自增
- SELECT DISTINCT UserID,0 AS DealCustomerCount,Serial=row_number() over(ORDER BY UserID) FROM CRM_Log_CheckTempCustomer
- WHERE UpdateTime>=@fromDate AND UpdateTime<@toDate
- GROUP BY UserID
- ORDER BY UserID;
- END
3.按时间一天一天的循环。
- ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser] --某段时间范围内,每一天的客户处理数进行累加
- @toDate datetime,
- @fromDate datetime
- AS
- SET NOCOUNT ON;
- DECLARE @toDateTemp datetime
- DECLARE @fromDateTemp datetime
- SET @fromDateTemp=@fromDate
- WHILE @fromDateTemp<@toDate --循环开始,起始时间一天天的推移,直到超过结束时间,这时循环结束。
- BEGIN --------------------------------业务开始,请自动忽略------------------------------
- SET @toDateTemp=DATEADD(DAY,1,@fromDateTemp) --当前一天的结束时间为当前起始时间+1
- IF(@toDateTemp>=@toDate) --当前一天的结束时间,大于结束时间的上限,重置为结束时间上限
- BEGIN
- SET @toDateTemp=@toDate
- END
- --查询当前一天的客户处理数
- SELECT @currentDealCustomerCount=COUNT(DISTINCT TempCustomerID)
- FROM CRM_Log_CheckTempCustomer
- WHERE UserID=@userID AND UpdateTime>=@fromDateTemp AND UpdateTime<@toDateTemp;
- --累加当前一天的客户处理数,最终循环结束时,可以得到该段时间范围内每一天客户处理数的统计
- SET @dealCustomerCount=@dealCustomerCount+@currentDealCustomerCount
- --------------------------------业务结束,请自动忽略------------------------------
- SET @fromDateTemp=DATEADD(DAY,1,@fromDateTemp)--起始时间+1推移,直到大于结束时间,结束循环
- END
- SELECT @dealCustomerCount AS DealCustomerCount
4.按表变量的长度进行循环,并可以操作表变量本身
- ALTER PROCEDURE [dbo].[GetDealCustomerCountByUser]
- AS
- BEGIN
- SET NOCOUNT ON;
- DECLARE @currentDealCustomerCount INT
- DECLARE @rows INT
- DECLARE @result TABLE(UserID INT,DealCustomerCount INT,Serial INT)
- INSERT INTO @result
- SELECT DISTINCT UserID,0 AS DealCustomerCount,Serial=row_number() over(ORDER BY UserID)
- FROM CRM_Log_CheckTempCustomer
- WHERE UpdateTime>=@fromDate AND UpdateTime<@toDate
- GROUP BY UserID
- ORDER BY UserID;
- SET @rows=@@RowCount --如果上一个操作添加8条操作,@@RowCount数值便是8
- --循环开始,当@rows-1递减,直到为0,循环结束
- --这里自增序号Serial和@rows是一致,每一次循环对应一个自增值,由此可以对@result操作
- WHILE @rows>0
- BEGIN
- SET @currentDealCustomerCount=0
- SELECT @currentDealCustomerCount=DealCustomerCount
- FROM @result
- WHERE Serial=@rows
- IF @currentDealCustomerCount>0
- BEGIN
- UPDATE @result SET DealCustomerCount=DealCustomerCount+@currentDealCustomerCount
- WHERE Serial=@rows
- END
- SET @rows=@rows-1 --当@rows减到0,结束循环
- END
- END
5.判断表变量是否为空。
- SELECT @resultTempCount=COUNT(1) FROM @resultTemp
- IF(@resultTempCount>0)
- BEGIN
- ......
- END
作者:焱龙
出处:http://star-studio.cnblogs.com/