2013-04-17 71 views
1

我有以下情形累积计数,并计数成负日期,并积极

Date  Amount Item 
6/17/08 208 1 
9/24/08 -48  1 
6/15/09 -160 1 
9/23/09 40  1 

出于同样的项目,我想在那里累积量小于或等于0,第一个日期时间 ,并且如果累积金额稍后变为正值,我也希望它的日期变为正值。

Date  Amount Item Cumulative Amount 
6/17/08 208 1 208 
9/24/08 -48  1  160 
6/15/09 -160 1  0 --This date 
9/23/09 40  1  40 --This date 

有关如何实现这一目标的任何建议?

+2

的SQL Server的哪个版本? – Quassnoi

+0

@Quassnoi'2008' – user2292378

回答

2

在SQL Server 2012:

SELECT date 
FROM (
     SELECT *, 
       SUM(amount) OVER (PARTITION BY item ORDER BY date) AS csum, 
       SUM(amount) OVER (PARTITION BY item ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS psum 
     FROM mytable 
     ) q 
WHERE (csum <= 0 AND psum > 0) 
     OR 
     (csum > 0 AND psum <= 0) 

在早期版本:

SELECT date 
FROM (
     SELECT *, 
       (
       SELECT SUM(amount) 
       FROM mytable mi 
       WHERE mi.item = m.item 
         AND mi.date < m.date 
       ) AS psum 
     FROM mytable m 
     ) q 
WHERE (psum + amount <= 0 AND psum > 0) 
     OR 
     (psum + amount > 0 AND psum <= 0) 
+0

+1(减去排序) – briantyler

+0

(减去排序) – user2292378

0

因为当它第一次变成非正日期:

SELECT MIN(t3.Date) AS dateCumAmountTurnsLTEZero 
FROM 
(SELECT Date, 
(SELECT SUM(Amount) 
    FROM mytable t1 
    WHERE t1.Date <= t2.Date) AS cumulativeAmount 
FROM mytable t2) t3 
WHERE t3.cumulativeAmount <= 0 

要获得之日起,再次转为正面,你可以将这个结果注入另一个查询中,或者假设你想在SQL中做所有事情,它会变得有点发型Y!请看下图:

SELECT MIN(t6.Date) 
FROM 
(SELECT Date, 
(SELECT SUM(Amount) 
    FROM mytable t4 
    WHERE t4.Date <= t5.Date) AS cumulativeAmount 
FROM mytable t5) t6 
WHERE t6.cumulativeAmount >= 0 
AND t6.Date > 
(SELECT MIN(t3.Date) 
FROM 
(SELECT Date, 
    (SELECT SUM(Amount) 
    FROM mytable t1 
    WHERE t1.Date <= t2.Date) AS cumulativeAmount 
    FROM mytable t2) t3 
    WHERE t3.cumulativeAmount <= 0) 

SQL Fiddle Demo