標籤:Sql Server 預存程序 遊標
一個Sql Server 的遊標與迴圈嵌套的預存程序用例準備代碼
--建立表CREATE TABLE everyoneAVG( ID int primary key identity(1,1), AccNo INT, AVGTime INT, AddTimes INT);DROP TABLE everyoneAVG;SELECT ID,AccNo AS ‘使用者號‘,AVGTime/60 AS ‘平均儲值時間間隔(小時)‘,AddTimes AS ‘總儲值次數‘ FROM everyoneAVGORDER BY AVGTime/60 DESC;DELETE everyoneAVG;
功能需求
查詢出一個時間段內每個人的平均儲值時間間隔
實現代碼
CREATE PROCEDURE P_getAVGAddTimeASBEGINDECLARE @AccountNo INT, --賬戶號 @AVGTime INT, --每個人平均儲值間隔時間(分鐘) @AddTimes INT, --每個人總儲值次數(忽略十分鐘內的儲值) @upConsumeTime DATETIME, --前一次成交時間 @ConsumeTime DATETIME, --當前成交時間 @TempTime INT --臨時記錄累加的間隔時間(分鐘) --聲明使用者號遊標 DECLARE allAcc_cursor CURSOR FOR SELECT top 99.9999 percent AccountNo FROM [CASH].[dbo].[tb_Customer] ORDER BY AccountNo OPEN allAcc_cursor --開啟遊標 FETCH NEXT FROM allAcc_cursor --擷取遊標下一行資料 INTO @AccountNo --使變數擷取當前遊標指定行的賬戶號 -----------外部遊標,ORDER BY AccountNo WHILE(@@FETCH_STATUS=0) BEGIN SET @TempTime=0 SET @AVGTime=0 --每個人平均儲值時間賦初值 SET @AddTimes=0 --每個人儲值次數賦初值 SET @upConsumeTime=‘2017-11-09 00:00:00.000‘ DECLARE ConsumeTime_Cursor CURSOR FOR --聲明成交時間 --儲值記錄查詢 SELECT top 99.9999 percent ConsumeTime FROM [CASH].[dbo].[tb_inf] WHERE [email protected] AND GrpNo=98 AND ExChgDate>=‘2017-11-09 00:00:00.000‘ AND ExChgDate<=‘2018-04-16 00:00:00.000‘ ORDER BY ConsumeTime OPEN ConsumeTime_Cursor --開啟成交時間遊標 FETCH NEXT FROM ConsumeTime_Cursor --擷取下一行資料 INTO @ConsumeTime WHILE(@@FETCH_STATUS=0) BEGIN --首次儲值處理 IF(@upConsumeTime=‘2017-11-09 00:00:00.000‘) BEGIN SET @[email protected] SET @[email protected]+1 END ELSE IF(DATEDIFF(MINUTE,@upConsumeTime,@ConsumeTime)<10) ----十分鐘內的儲值時間忽略 BEGIN SET @[email protected] END ELSE BEGIN SET @[email protected]+1 --儲值次數累加 SET @[email protected]+DATEDIFF(MINUTE,@upConsumeTime,@ConsumeTime) --儲值時間間隔累加 SET @[email protected] END FETCH NEXT FROM ConsumeTime_Cursor --擷取下一行資料 INTO @ConsumeTime END --僅儲值一次或從未儲值 IF(@AddTimes=1) BEGIN SET @AVGTime=0 END ELSE BEGIN SET @[email protected]/(@AddTimes-1) END --將得到的平均值存入暫存資料表 BEGIN INSERT INTO [CASH].[dbo].[everyoneAVG] VALUES(@AccountNo,@AVGTime,@AddTimes) END CLOSE ConsumeTime_Cursor --關閉內部遊標 DEALLOCATE ConsumeTime_Cursor --釋放內部遊標 FETCH NEXT FROM allAcc_cursor --擷取遊標下一行資料 INTO @AccountNo --使變數擷取當前遊標指定行的賬戶號 END CLOSE allAcc_cursor --關閉外部遊標 DEALLOCATE allAcc_cursor --釋放外部遊標ENDGO
一個Sql Server 的遊標與迴圈嵌套的預存程序用例