Sql 第一列更新了一个while循环,该循环计算累计值,结果却给出了总数

Sql 第一列更新了一个while循环,该循环计算累计值,结果却给出了总数,sql,sql-server,Sql,Sql Server,我使用MS SQL Server 2008 R2 我通过一个while循环Bajas->BajasYtD,Headcount->HeadcountYtD,以此类推,使用不以“YtD”结尾的对应列计算以“YtD”结尾的列的累积值 问题是第一列给出的是总计,而不是每次迭代的累积值 我尝试恢复更新值的顺序,它给了我相同的结果,但现在是HeadcountYtD列 结果是: id Periodo Baj

我使用MS SQL Server 2008 R2

我通过一个while循环Bajas->BajasYtD,Headcount->HeadcountYtD,以此类推,使用不以“YtD”结尾的对应列计算以“YtD”结尾的列的累积值

问题是第一列给出的是总计,而不是每次迭代的累积值

我尝试恢复更新值的顺序,它给了我相同的结果,但现在是HeadcountYtD列

结果是:

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的列的累积值