下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當前位置:軟件下載吧 > 數據庫 > MS_SQL > SQL開發知識:SQL Server 開窗函數 Over()代替游標的使用詳解

          SQL開發知識:SQL Server 開窗函數 Over()代替游標的使用詳解

          時間:2024-02-05 12:47作者:下載吧人氣:22

          前言:

          今天在優化工作中遇到的sql慢的問題,發現以前用了挺多游標來處理數據,這樣就導致在數據量多的情況下,需要一行一行去遍歷從而計算需要的數據,這樣處理的結果就是數據慢,容易卡死。

          語法介紹:

          1、與Row_Number() 函數結合使用,對結果進行排序,這個是我們使用的非常多的

            SQL開發知識:SQL Server 開窗函數 Over()代替游標的使用詳解

          2、與聚合函數結合使用,利用over子句的分組和排序,對需要的數據進行操作

          例如:SUM() Over() 累加值、AVG() Over() 平均數
          MAX() Over() 最大值、MIN() Over() 最小值

          具體介紹:

          下面模擬工作中通過開窗函數代替游標的例子,通過期初余額與單據的預收金額、應收金額、實收金額來計算截止本單的期末余額,在以往就是通過游標一行一行去遍歷,計算需要的期末余額,現在使用SUM() Over()來代替,最終要實現的效果圖如下:

          SQL開發知識:SQL Server 開窗函數 Over()代替游標的使用詳解

          第一行表示標題;第二行表示客戶,是一行空行;第三行是期初余額,只顯示期末余額的數據,第四至第六行表示的是每種單據的余額情況,并逐步匯總當前行的期末余額數據;最后一行表示的是對客戶的合計。

          1、構建需要用到的表和數據(簡略版)

          –客戶表
          CREATE TABLE Organization(
          FItemID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
          FNumber NVARCHAR(255),
          FName NVARCHAR(255)
          )

          –期初數據表
          CREATE TABLE InitialData(
          FID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
          FCustId INT NOT NULL,
          FPreAmount DECIMAL(28,10) NOT NULL DEFAULT(0), –預收金額
          FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0), –應收金額
          FReceiveAmount DECIMAL(28,10) NOT NULL DEFAULT(0) –實收金額
          )

          –單據明細表
          CREATE TABLE DetailData(
          FID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
          FCustId INT NOT NULL,
          FDate DATETIME NOT NULL,
          FBillType NVARCHAR(64) NOT NULL,
          FBillNo NVARCHAR(64) NOT NULL,
          FPreAmount DECIMAL(28,10) NOT NULL DEFAULT(0), –預收金額
          FReceivableAmount DECIMAL(28,10) NOT NULL DEFAULT(0), –應收金額
          FReceiveAmount DECIMAL(28,10) NOT NULL DEFAULT(0) –實收金額
          )

          INSERT INTO Organization(FNumber,FName) VALUES(‘001′,’北京客戶’)
          INSERT INTO Organization(FNumber,FName) VALUES(‘002′,’上海客戶’)
          INSERT INTO Organization(FNumber,FName) VALUES(‘003′,’廣州客戶’)

          INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(1,0,0,0)
          INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,8000,7245,0)
          INSERT INTO InitialData(FCustId,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(3,0,1068.21,1068.00)

          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(1,’2020-06-30′,’委托結算’,’XSD20200700008′,0,1221.56,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(1,’2020-06-30′,’委托結算’,’XSD20200700009′,0,373.46,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(1,’2020-06-30′,’委托結算退貨’,’XSD20200700010′,0,-427.05,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(1,’2020-07-30′,’銷售商品返利’,’XSFL20200700005′,0,-17.9,0)

          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,’2020-06-25′,’預收退款’,’SKD20200700002′,-755,0,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,’2020-06-20′,’銷售發貨’,’XSD20200700006′,0,6169.50,6169.50)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,’2020-07-30′,’銷售總額返利’,’XSFL20200700002′,0,-493.56,-421.85)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,’2020-07-31′,’其他應收’,’QTYS20200900001′,0,6000.00,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(2,’2020-06-20′,’預收沖應收’,’HXD20200700006′,-7245.00,0,7245.00)

          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(3,’2020-06-30′,’銷售收款’,’SKD20200700003′,0,0,2386.96)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(3,’2020-06-30′,’應收轉應收’,’HXD20200700007′,0,2386.75,0)
          INSERT INTO DetailData(FCustId,FDate,FBillType,FBillNo,FPreAmount,FReceivableAmount,FReceiveAmount)
          VALUES(3,’2020-07-08′,’銷售退貨’,’XSD20200700014′,0,-46.80,0)
          GO

          標簽MSSQL,SQLServer,技術文檔,數據庫,SQLSERVER

          相關下載

          查看所有評論+

          網友評論

          網友
          您的評論需要經過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 亚洲福利一区二区| 肉色超薄丝袜脚交一区二区| 手机福利视频一区二区| 福利国产微拍广场一区视频在线 | 国产一区二区在线观看视频| 福利一区二区视频| 国产亚洲一区二区三区在线| 久久久av波多野一区二区| 日韩精品一区二区三区中文字幕 | 一区二区三区免费视频网站| 上原亚衣一区二区在线观看| 国产精品一区二区久久精品| 精品国产AⅤ一区二区三区4区 | 精品视频午夜一区二区| 日韩人妻一区二区三区免费| 精品日韩在线视频一区二区三区 | 中文字幕无线码一区| 国产高清在线精品一区| 立川理惠在线播放一区| 无码日韩精品一区二区免费| 熟女少妇丰满一区二区| 国产福利一区二区| 国产精品揄拍一区二区| 麻豆aⅴ精品无码一区二区| 中文乱码精品一区二区三区| 国产精品免费综合一区视频| 日本无码一区二区三区白峰美 | 手机福利视频一区二区| eeuss鲁片一区二区三区| 免费播放一区二区三区| 国产一区二区三区夜色| 国产一区二区视频在线播放 | 国模少妇一区二区三区| 亚洲日本一区二区三区在线| 伊人精品视频一区二区三区| 一区免费在线观看| 国产精品无圣光一区二区| 国产亚洲无线码一区二区| 一区二区三区国产精品| 精品熟人妻一区二区三区四区不卡| 亚洲国产美国国产综合一区二区 |