开发者

While Loop in TSQL with Sum totals

开发者 https://www.devze.com 2023-01-02 09:16 出处:网络
I have the following TSQL Statement, I am trying to figure out how I can keep getting the results (100 rows at a time), store them in a variable (as I will have to add the totals after each select) an

I have the following TSQL Statement, I am trying to figure out how I can keep getting the results (100 rows at a time), store them in a variable (as I will have to add the totals after each select) and continue to select in a while loop until no more records are found and then return the variable totals to the calling function.

SELECT [OrderUser].OrderUserId, ISNULL(SUM(total.FileSize), 0), ISNULL(SUM(total.CompressedFileSize), 0)
FROM 
(
 SELECT DISTINCT开发者_如何学Go TOP(100) ProductSize.OrderUserId, ProductSize.FileInfoId, 
 CAST(ProductSize.FileSize AS BIGINT) AS FileSize, 
 CAST(ProductSize.CompressedFileSize AS BIGINT) AS CompressedFileSize
 FROM ProductSize WITH (NOLOCK)
 INNER JOIN [Version] ON ProductSize.VersionId = [Version].VersionId
) AS total RIGHT OUTER JOIN [OrderUser] WITH (NOLOCK) ON total.OrderUserId = [OrderUser].OrderUserId
WHERE NOT ([OrderUser].isCustomer = 1 AND [OrderUser].isEndOrderUser = 0 OR [OrderUser].isLocation = 1) 
AND [OrderUser].OrderUserId = 1
GROUP BY [OrderUser].OrderUserId


Depending on the clustered index, if its by numbered id, then use the code below. If its by date, go in 10 - 60 minute increments. keep an eye on performance of other things, but the lovely part of this code is you can start and stop at anytime if you push the results to permanent temp table (real table, just temp)

Here's a sample:

declare @count int
Declare @batch int
declare @max int

create table #temp (id int identity(1,1) primary key, Batch int, value int)


select @max = max(OrderUserId), @count = 0, @batch = 1000 from table

while (@count < @max)
begin

insert into #temp (batch,value)
select @count, Sum(stuffs)
from table
where orderId >= @count
 and orderid < @count + @batch

Set @count = @count + @batch

waitfor delay ('00:00:01')
Raiserror('On Batch %d',0,1,@Count) with nowait /* Will print progess */
end
0

精彩评论

暂无评论...
验证码 换一张
取 消