假设我有一个这样的表:
表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
答案 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
t1
和t2
之间实现少一个关系。您可以根据自己的实际需要进行更改。
答案 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