年初至今计算SQL

时间:2014-11-28 01:33:02

标签: sql sql-server sql-server-2008

我有下表:

oGroup     oDate          oValue
--------------------------------
A          2014-01-01     10
A          2014-01-02     20
A          2014-02-01     10
A          2014-02-02     10
A          2014-03-01     10
A          2014-04-01     30
A          2014-05-01     10
B          2014-01-01     5

然后我有以下存储过程:

CREATE PROCEDURE _spTest
    (@oMonth int, @oYear int)
AS
BEGIN
    SELECT 
        oGroup, oDate, oValue
    FROM 
        oTable
    WHERE 
        DATEPART(MONTH, oDate) = @oMonth 
        AND DATEPART(YEAR, oDate) = @oYear
END

因此,如果我为@oMonth = 4和@oYear = 2014设置参数。那么所有包含第4个月(4月)和2014年的记录都将显示为结果。

我的问题是:我想知道从年初开始的'oValue'总数,直到与上面存储过程相同参数的给定值。我怎样才能做到这一点?

例如,如果@oMonth是4,而@oYear是2014.那么结果应该是2014年1月SUM的{​​{1}} + oValue SUM 2014年2月+ 2014年3月oValue SUM + 2014年4月oValue SUM

结果应该是这样的:

oValue

谢谢。

2 个答案:

答案 0 :(得分:1)

使用Between运算符过滤从当前年份开始的记录。使用Sum aggregate查找ovalue

的总和
create table #test( oGroup   char(1),  oDate    date,      oValue int)
insert #test values
('A'          ,'2014-01-01' ,    10),
('A'          ,'2014-01-02' ,    20),
('A'          ,'2014-02-01'  ,   10),
('A'          ,'2014-02-02' ,    10),
('A'          ,'2014-03-01' ,    10),
('A'          ,'2014-04-01' ,    30),
('A'          ,'2014-05-01' ,    10),
('B'          ,'2014-01-01' ,    5)

DECLARE @oMonth INT=4,
        @oYear  INT=2014

SELECT oGroup,
       Sum(oValue) Total
FROM   #test
WHERE  Datepart(MONTH, oDate) BETWEEN 1 AND @oMonth
       AND Datepart(YEAR, oDate) = @oYear
GROUP  BY oGroup,
          Year(odate) 

输出

oGroup  Total
------  -----
A       90
B       5

答案 1 :(得分:0)

你的意思是这样吗?

CREATE PROCEDURE _spTest
(@oMonth int, @oYear int)
AS
BEGIN
      SELECT 
          oGroup
          , max(oDate)
          , sum(oValue)
      FROM 
          oTable
      WHERE 
          DATEPART(MONTH, oDate) <= @oMonth 
          AND DATEPART(YEAR, oDate) = @oYear
      GROUP BY
          oGroup
END

(不确定您是否希望它按oGroup分组,或者您想要对oDate列进行分组)