按条件

时间:2015-12-09 20:41:44

标签: sql sql-server-2008 select sql-update

假设我有一个这样的表:

表1

 EmployeeID   Month          sym      Quantity       V_M       BudjetCode
    222222            1           40          133.35    1214          800000
    222222            2           40         178.50     115           800000
    222222            3           40         150.33     215           800000
    222222            4           40         186.37     315           800000
    222222            5           40         127.38     415           800000
    222222            6           40         153.00     515           800000
    222222            7           40         178.50     615           800000
    222222            7           40          8.50      615         700052015
    222222            8           40         187.00     715          800000

我想将此表更改为:

表2

EmployeeID    Month          sym      Quantity          V_M           BudjetCode
        222222            1           40          133.35    1214          800000
        222222            2           40         178.50     115           800000
        222222            3           40         150.33     215           800000
        222222            4           40         186.37     315           800000
        222222            5           40         127.38     415           800000
        222222            6           40         161.5      515           800000
        222222            7           40         178.50     615           800000
        222222            8           40         187.00     715          800000

如何? 请参阅表1中BudjetCode不常见的行?

好吧,对于这一行,我想将Quantity值(8.5)添加到V_M比原始行(其中budjetCode为700052015)的V_M小一行。

在这个例子中,在原来它是615所以少一个是515(615表示日期6.15,515表示5.15)并且我需要添加数量(8.5到153 = 161.5)

我在考虑" over partition":

select [EmployeeID],[Month],[Sym],
sum([Quantity]) 
over (partition by [EmployeeID], [V_M]-1 where???) as b
from table1 
where [Sym] = '40' and [EmployeeID] = 222222
order by [Month]

但我不知道如何总结这一点,因为budjetCode的标准始于" 700"。

评论:第一行不要这样做。

更新

EmployeeID month Quantity V_M   MS_BudjetCode
22222   1   40  133.35  1214    88888888
22222   2   40  178.50  115 88888888
22222   3   40  150.33  215 88888888
22222   4   40  186.37  315 88888888
22222   5   40  127.38  415 88888888
22222   6   40  153.00  515 88888888
22222   7   40  8.50    615 700000000
22222   7   40  178.50  615 88888888
22222   8   40  187.00  715 88888888

输出:

22222   2   40  178.50  115 88888888
22222   4   40  186.37  315 88888888
22222   8   40  187.00  715 88888888
22222   3   40  151.33  215 88888888
22222   3   40  151.33  215 88888888
22222   3   40  151.33  215 88888888
22222   3   40  149.33  215 88888888
22222   3   40  149.33  215 88888888
22222   5   40  127.38  415 88888888
22222   6   40  152.00  515 88888888
22222   6   40  154.00  515 88888888
22222   6   40  152.00  515 88888888
22222   6   40  154.00  515 88888888
22222   6   40  154.00  515 88888888
22222   6   40  152.00  515 88888888
22222   6   40  161.50  515 88888888
22222   7   40  178.50  615 88888888
22222   1   40  133.35  1214    88888888

查询:

SELECT t1.EmployeeID, t1.Month, t1.sym, 
       t1.Quantity + COALESCE(t2.Quantity, 0), 
       t1.V_M, t1.BudjetCode 
FROM Table1 AS t1
LEFT JOIN Table1 AS t2 
  ON t1.EmployeeID = t2.EmployeeID AND t1.V_M = t2.V_M - 100 AND 
     SUBSTRING(t2.BudjetCode,1,3) = '700'
WHERE SUBSTRING(t1.BudjetCode,1,3) <> '700' and sym='40' and EmployeeID = 22222

3 个答案:

答案 0 :(得分:0)

我认为您可以使用简单的LEFT JOIN操作来执行您想要的操作:

SELECT t1.EmployeeID, t1.Month, t1.sym, 
       t1.Quantity + COALESCE(t2.Quantity, 0), 
       t1.V_M, t1.BudjetCode 
FROM Table1 AS t1
LEFT JOIN Table1 AS t2 
  ON t1.EmployeeID = t2.EmployeeID AND t1.V_M = t2.V_M - 100 AND 
     SUBSTRING(t2.BudjetCode,1,3) = '700'
WHERE SUBSTRING(t1.BudjetCode,1,3) <> '700'

查询选择所有表格行但是“不寻常”的行并在一天之前将它们与“异常”行连接起来(或者可能是小时?)。返回的Quantity是“正常”行的值加上相关“异常”行的值的总和(如果确实存在这样的行)。

表达式:

t1.V_M = t2.V_M - 100

V_M t1t2之间实现少一个关系。您可以根据自己的实际需要进行更改。

Demo here

答案 1 :(得分:0)

这会解决您的问题吗?

DELETE
FROM
table
WHERE BudjetCode='700052015'

UPDATE table
SET Quantity = (Quantity+8.5)
WHERE Month = 6;

答案 2 :(得分:0)

这可能是一个解决方案,我认为我们不能简单地用月减1,还需要考虑12月1日的情况。我也把检查包括在内。这里的预算代码是根据长度区分的,您可以根据需要进行更改。

;WITH CTETable1 AS ( SELECT EmployeeID,[Month],sym, CASE WHEN LEN(BudjetCode)>6 THEN Quantity ELSE 0 END Quantity, CASE WHEN LEN(BudjetCode)>6 THEN (CASE WHEN LEFT(V_M,LEN(V_M)-2)=1 THEN 12 ELSE LEFT(V_M,LEN(V_M)-2)-1 END)*100+ (CASE WHEN LEFT(V_M,LEN(V_M)-2)=1 THEN RIGHT(V_M,2)-1 ELSE RIGHT(V_M,2) END) ELSE 0 END V_M, BudjetCode FROM Table1 ) SELECT T1.EmployeeID,T1.[Month],T1.sym,T1.Quantity+ISNULL(T2.Quantity,0) Quantity, T1.V_M,T1.BudjetCode FROM Table1 T1 LEFT JOIN CTETable1 T2 ON T1.EmployeeID=T2.EmployeeID AND T1.V_M=T2.V_M WHERE LEN(T1.BudjetCode)=6