SQL更新表循环

时间:2017-07-18 21:42:29

标签: sql-server dynamic sql-update

我有以下查询给我一个小结果集

SELECT 
    LOC, PLAN, FiscalYear, FiscalPeriod, SALES 
FROM
    #CurrentPrd PrdAg
WHERE 
    NOT EXISTS (SELECT AGE.ECPLAN 
                FROM ECPG_BAK AGE 
                WHERE PrdAg.LOC = AGE.STORE 
                  AND PrdAg.PLAN = AGE.PLAN 
                  AND PrdAg.FiscalYear = AGE.FiscalYear 
                  AND PrdAg.FiscalPeriod = AGE.FiscalPeriod)

结果集如下所示:

LOC PLAN    FiscalYear  FiscalPeriod    SALES
---------------------------------------------------
 5  6       2031        5               -0.206232
12  6       2031        5                5.243052
12  8       2020        4                1.699716
12  8       2020        5                1.699716
14  6       2031        5                0.299972
19  6       2031        5                1.549812
19  8       2020        5               20.114116
33  6       2031        5                2.159767
33  8       2020        5               23.796883
34  6       2031        5                1.142360
34  8       2020        5                9.348583
................................................

然后我有另一个查询,它会为我提供一个我需要添加到SALES列的数字。例如,下面的查询,我使用固定的loc并计划提出一个数字:

select 
    (select SALES 
     from #TOT 
     where loc = 12 and PLAN = 6) - (select sum(sales) 
                                     from #CurrentPrd 
                                     where store = 12 and PLAN = 6) as Comp

让我们假设上面的这个查询得到10,然后我需要将它添加到上面结果集的第2行,使其成为

LOC PLAN    FiscalYear  FiscalPeriod    SALES
----------------------------------------------
12  6       2031        5               15.243052

我的目标是让它有点动态并以简单的方式完成整个过程,因此对于每个LOC和PLAN组合,我会将这些值插入第二个选择以检索要添加到SALES的正确数字,然后更新#CurrentPrd。将新数字写入新临时表也是一种选择。

我希望我能够解释我想要做的事情。任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

没有任何实际的测试数据,很难肯定地说,但我认为以下内容对您有用...

SELECT 
    PrdAg.LOC, 
    PrdAg.[PLAN], 
    PrdAg.FiscalYear, 
    PrdAg.FiscalPeriod, 
    SALES = PrdAg.SALES + (tx.SALES - cpx.SALES)
FROM 
    #CurrentPrd PrdAg
    CROSS APPLY (SELECT TOP 1 T.SALES FROM #TOT T WHERE PrdAg.LOC = T.LOC AND PrdAg.[PLAN] = t.[PLAN]) tx
    CROSS APPLY (SELECT SALES = SUM(CP.SALES) FROM #CurrentPrd CP WHERE PrdAg.LOC = CP.LOC AND PrdAg.[PLAN] = CP.[PLAN]) cpx
WHERE 
    NOT EXISTS (
            SELECT 1 
            FROM 
                ECPG_BAK AGE 
            WHERE 
                PrdAg.LOC = AGE.STORE 
                AND PrdAg.[PLAN] = AGE.[PLAN] 
                AND PrdAg.FiscalYear = AGE.FiscalYear 
                AND PrdAg.FiscalPeriod = AGE.FiscalPeriod
            );