22,209
社区成员
发帖
与我相关
我的任务
分享
--子查询+case when实现
SELECT id,COUNT,
结果=CASE WHEN (SELECT SUM(count) FROM t1 AA WHERE AA.createdate<=t1.createdate)<=2400 THEN 0 ELSE count-(2400-(SELECT SUM(count) FROM t1 AA WHERE AA.createdate<t1.createdate)) END
FROM t1
IF OBJECT_ID('t1') IS NOT NULL
DROP TABLE t1
GO
CREATE TABLE t1 (id int, count int, createdate datetime)
GO
INSERT INTO t1
SELECT 1, 100,'2014-1-1' UNION ALL
SELECT 2,1500,'2014-1-2' UNION ALL
SELECT 3,3000,'2014-1-3' UNION ALL
SELECT 4, 300,'2014-1-4' UNION ALL
SELECT 5,5000,'2014-1-5' UNION ALL
SELECT 6,1000,'2014-1-6' -- 加一条更新无关的进行对比
GO
--子查询+case when实现
SELECT id,COUNT, ROW_NUMBER()
结果=CASE WHEN (SELECT SUM(count) FROM t1 AA WHERE AA.createdate<=t1.createdate)<=5000 THEN 0 ELSE count-(5000-(SELECT SUM(count) FROM t1 AA WHERE AA.createdate<t1.createdate)) END
FROM t1
IF OBJECT_ID('表1') IS NOT NULL
DROP TABLE 表1
GO
CREATE TABLE 表1 (id int, count int, createdate datetime)
GO
INSERT INTO 表1
SELECT 1, 100,'2014-1-1' UNION ALL
SELECT 2,1500,'2014-1-2' UNION ALL
SELECT 3,3000,'2014-1-3' UNION ALL
SELECT 4, 300,'2014-1-4' UNION ALL
SELECT 5,5000,'2014-1-5' UNION ALL
SELECT 6,1000,'2014-1-6' -- 加一条更新无关的进行对比
GO
DECLARE @总量 INT
SET @总量 = 5000
IF OBJECT_ID('表1') IS NOT NULL
DROP TABLE #T
SELECT *
INTO #T
FROM (SELECT T1.id, T1.createdate, T1.count,
(SELECT ISNULL(SUM(count),0) FROM 表1 T2 WHERE T2.createdate < T1.createdate) 前累计数量
FROM 表1 T1
) T
WHERE 前累计数量 < @总量
-- 全取光的
UPDATE 表1
SET count = 0
FROM 表1, #T
WHERE 表1.id = #T.id
AND (#T.前累计数量 + #T.count) <= @总量
-- 有节余的
UPDATE 表1
SET count = (#T.前累计数量 + #T.count) - @总量
FROM 表1, #T
WHERE 表1.id = #T.id
AND (#T.前累计数量 + #T.count) > @总量
SELECT * FROM 表1
id count createdate
----------- ----------- ----------
1 0 2014-01-01
2 0 2014-01-02
3 0 2014-01-03
4 0 2014-01-04
5 4900 2014-01-05
6 1000 2014-01-06
为了简单起见,用了ID替代时间
create table t1
(
id int,
account int
)
insert into t1 values (1,RAND()*100)
insert into t1 values (2,RAND()*100)
insert into t1 values (3,RAND()*100)
insert into t1 values (4,RAND()*100)
insert into t1 values (5,RAND()*100)
insert into t1 values (6,RAND()*100)
insert into t1 values (7,RAND()*100)
insert into t1 values (8,RAND()*100)
insert into t1 values (9,RAND()*100)
insert into t1 values (10,RAND()*100)
select * from t1
id account
----------- -----------
1 90
2 46
3 90
4 32
5 41
6 66
7 59
8 67
9 98
10 92
(10 行受影响)
select *
from t1
where id <=
(select MIN(id)
from (select A2.id,
(select sum(A1.account) from t1 A1 where A1.id <= A2.Id) as total
from t1 A2) t
where total >= 500)
id account
----------- -----------
1 90
2 46
3 90
4 32
5 41
6 66
7 59
8 67
9 98
(9 行受影响)
SELECT *
FROM (SELECT T1.id, T1.时间, T1.数量,
(SELECT SUM(数量) FROM 表1 T2 WHERE T2.时间 < T1.时间) 前累计数量
FROM 表1 T1
) T
WHERE 前累计数量<5000
AND (前累计数量+数量)>=5000