【问题标题】:Year to Date calculation SQL年初至今计算 SQL
【发布时间】:2014-11-28 01:33:02
【问题描述】:

我有下表:

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 月 oValue 的 SUM + 2014 年 2 月 oValue 的 SUM + SUM oValue 于 2014 年 3 月 + SUM oValue 于 2014 年 4 月

结果应该是这样的:

oGroup     oValue_SUM
---------------------
A          90
B          5

谢谢。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      你的意思是这样的吗?

      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 列做什么)

      【讨论】:

        猜你喜欢
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 2023-03-16
        • 2013-01-02
        • 1970-01-01
        相关资源
        最近更新 更多