Sql 第一列更新了一个while循环,该循环计算累计值,结果却给出了总数
我使用MS SQL Server 2008 R2 我通过一个while循环Bajas->BajasYtD,Headcount->HeadcountYtD,以此类推,使用不以“YtD”结尾的对应列计算以“YtD”结尾的列的累积值 问题是第一列给出的是总计,而不是每次迭代的累积值 我尝试恢复更新值的顺序,它给了我相同的结果,但现在是HeadcountYtD列 结果是:Sql 第一列更新了一个while循环,该循环计算累计值,结果却给出了总数,sql,sql-server,Sql,Sql Server,我使用MS SQL Server 2008 R2 我通过一个while循环Bajas->BajasYtD,Headcount->HeadcountYtD,以此类推,使用不以“YtD”结尾的对应列计算以“YtD”结尾的列的累积值 问题是第一列给出的是总计,而不是每次迭代的累积值 我尝试恢复更新值的顺序,它给了我相同的结果,但现在是HeadcountYtD列 结果是: id Periodo Baj
id Periodo Bajas Headcount Rango Rot BajasYtD HeadcountYtD RangoYtD RotYtD
----------- -------------------------------------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
1 2018-01 276 328453 28 0.0235284804827479 3756 328453 0 0
2 2018-02 336 336807 28 0.0279329111330822 3756 665260 0 0
3 2018-03 325 337985 28 0.0269242717872095 3756 1003245 0 0
4 2018-04 420 342765 28 0.0343092206030371 3756 1346010 0 0
5 2018-05 415 344723 28 0.0337082237042495 3756 1690733 0 0
6 2018-06 315 347945 28 0.0253488338674216 3756 2038678 0 0
7 2018-07 321 351110 28 0.025598815186124 3756 2389788 0 0
8 2018-08 367 353390 28 0.0290783553581029 3756 2743178 0 0
9 2018-09 329 357692 28 0.0257540006486027 3756 3100870 0 0
10 2018-10 337 360974 28 0.0261403868422657 3756 3461844 0 0
11 2018-11 315 245736 19 0.0243554058013478 3756 3707580 0 0
我的代码是:
USE DBDMS
IF OBJECT_ID('TEMPDB..#TablaBajas') IS NOT NULL
BEGIN
DROP TABLE #TablaRotPeriodo
END
CREATE TABLE #TablaRotPeriodo
(id int identity(1,1)
,Periodo varchar(50)
,Bajas float
,Headcount float
,Rango float
,Rot float
,BajasYtD float
,HeadcountYtD float
,RangoYtD float
,RotYtD float)
INSERT INTO #TablaRotPeriodo
SELECT TPO_CPeriodo AS Periodo
,SUM(ROT_IBAJA) AS Bajas
,SUM(ROT_IHCOUNT) AS Headcount
,COUNT(DISTINCT T.TPO_CFecha) AS Rango
,SUM(ROT_IBAJA)/(SUM(ROT_IHCOUNT)/COUNT(DISTINCT T.TPO_CFecha)) AS Rot
,0 AS BajasYtD
,0 AS HeadcountYtD
,0 AS RangoYtD
,0 as RotYtD
FROM TH_Rotacion R
INNER JOIN TD_Tiempo T ON R.TPO_KFECHA=T.TPO_KFecha
WHERE T.TPO_CFecha>=@vDiaiYtD
AND T.TPO_CFecha<=@vDiaf
GROUP BY TPO_CPeriodo
ORDER BY TPO_CPeriodo asc
SELECT * FROM #TablaRotPeriodo
DECLARE @cnt int =1;
WHILE (@cnt <= (SELECT COUNT(*) FROM #TablaRotPeriodo))
BEGIN
UPDATE #TablaRotPeriodo
SET BajasYtD =(SELECT SUM(Bajas) FROM #TablaRotPeriodo WHERE id<=@cnt)
UPDATE #TablaRotPeriodo
SET HeadcountYtD =(SELECT SUM(Headcount) FROM #TablaRotPeriodo WHERE id<=@cnt)
WHERE [id]=@cnt
SET @cnt=@cnt+1
END
SELECT * FROM #TablaRotPeriodo
您可以通过单个选择和应用来完成此操作: 不需要while循环
在SQL Server 2012中,使用窗口函数将更简单、更高效。只需一次选择并应用即可: 不需要while循环
在SQL Server 2012中,使用窗口函数将更简单、更高效。如果我正确理解您的查询,您将尝试获取一段时间内Bajas和员工总数的累计总和。如果是这种情况,此窗口方法应该可以工作:
SELECT id, periodo,
Bajas, SUM(Bajas) OVER(ORDER BY periodo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS BajasYTD,
HeadCount, SUM(HeadCount) OVER(ORDER BY periodo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS HeadCountYTD
FROM table
如果我正确理解您的查询,那么您正在尝试获取一段时间内Bajas和员工总数的累计总和。如果是这种情况,此窗口方法应该可以工作:
SELECT id, periodo,
Bajas, SUM(Bajas) OVER(ORDER BY periodo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS BajasYTD,
HeadCount, SUM(HeadCount) OVER(ORDER BY periodo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS HeadCountYTD
FROM table
示例数据、所需结果和列逻辑是一个好问题真正需要的。您正在尝试获取哪些列的累积值?我正在尝试计算所有具有后缀YtDSample data、所需结果、,列的逻辑是一个好问题真正需要的。你想得到哪些列的累积值?我想计算所有后缀为YtD的列的累积值