我有需要正確匯總的資料,但不太清楚如何:
create table #Test
(
Job [nvarchar](20)
,[Order] [nvarchar](20)
,WeekNumber int
,startday date
,endday date
,WeeklyHrs decimal(17, 5)
,WhatTheClientWants decimal(17, 5)
,PreviousHrs decimal(17, 5)
)
INSERT INTO #Test
VALUES
(1,1,1,'2022-05-09','2022-05-15',172,NULL,0),
(1,1,2,'2022-05-16','2022-05-22',9,NULL,0),
(1,2,1,'2022-05-09','2022-05-15',9,NULL,0),
(1,2,999,NULL,NULL,32.5,NULL,32.5),
(1,5,1,'2022-05-09','2022-05-15',162,NULL,0),
(1,5,2,'2022-05-16','2022-05-22',20,NULL,0),
(1,5,3,'2022-05-16','2022-05-22',0,NULL,0),
(1,6,2,'2022-05-16','2022-05-22',1,NULL,0),
(1,3,999,NULL,NULL,32.5,NULL,54)
所以客戶端有兩個引數,@startdate,@enddate,在這些引數之間我形成了幾個星期。比如 09.05.2022 - 15.05.2022 - 第 1 周、16.05.2022、22.05.2022 - 第 2 周。取決于此,我稍后進行了分組,但現在出現了新任務。我需要讓第二周的小時數加上第一周的小時數,第三周(可能有很多周)從第一周、第二周和第三周開始的小時數等等......我嘗試用 while 更新,但它沒有t安靜的作業,然后我嘗試了Window Function,但我做錯了:
declare @MaxWeek int = (select top 1 max(WeekNumber) over (PARTITION BY job) from #Test where WeekNumber <> 999)
DECLARE @i int = 0
WHILE (@i <= @MaxWeek)
BEGIN
UPDATE #Test
set WhatTheClientWants = (select sum(FullHrs) from #Test group by Job, WeekNumber)
set @i= @i 1
END
我想應該有某種情況,如果第一周,它只是幾個小時,但如果不是,某種總和
WHILE (@i <= @MaxWeek)
BEGIN
UPDATE #Test
set WhatTheClientWants = FullHrs from #Test where WeekNumber = @i
set @i= @i 1
END
但是我不知道是什么情況...
它應該是什么樣子:

將不勝感激任何幫助!
uj5u.com熱心網友回復:
考慮使用視窗函式來執行此操作:
SELECT testtable.*,
SUM(WeeklyHours) OVER (PARTITION BY [Order] ORDER BY startday ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS WhatTheClientWants
FROM #test as testtable
這就是對共享相同“磁區”(或 [Order] 列值)的每組記錄進行排序startday,然后將它們全部匯總到當前行。磁區內的累積總和。
雖然總是很容易想到“WHILE LOOP!” 作為一種解決方案,在幾乎不需要的資料庫中。在這個領域的十多年里,我只需要使用一次while回圈來獲得一個非常程式化的解決方案,它沒有基于集合的替代方案。
剛剛注意到新列中 NULL startday 的空值。用 UNION ALL 解決這個問題就足夠了:
SELECT testtable.*,
SUM(WeeklyHrs) OVER (PARTITION BY [Order] ORDER BY startday ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS WhatTheClientWants
FROM #test as testtable
WHERE StartDay IS NOT NULL
UNION ALL
SELECT testtable.*, NULL
FROM #test as testtable
WHERE StartDay IS NULL
uj5u.com熱心網友回復:
JNevill 解決方案的替代方案
select Job
,[Order]
,WeekNumber
,startday
,endday
,WeeklyHrs
,sum(WeeklyHrs) OVER (PARTITION BY [Order] ORDER BY [Order], WeekNumber )
,PreviousHrs
from #test
因為你似乎只是在磁區[Order]
順便說一句,這可能與您的預期結果不符 - 這些結果與您提供的資料完全不符 - 可能需要您檢查其他內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476563.html
下一篇:在臨時表sql中創建計算列
