SUM从特定日期到月末SQL

时间:2014-10-03 08:17:38

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

我有下表:

ID   GROUPID    oDate       oValue
1    A          2014-06-01  100
2    A          2014-06-02  200
3    A          2014-06-03  300
4    A          2014-06-04  400
5    A          2014-06-05  500
FF. until the end of the month
30   A          2014-06-30  600

我有3种GROUPID,每组每天会创建一条记录 我想计算从每个月的第2天到月末的oValue总数。所以6月的总数将从2014年6月2日到2014年6月30日。如果是7月,那么总数将从2014年7月2日到2014年7月31日。

输出将如下(示例):

GROUPID   MONTH   YEAR   tot_oValue
A         6       2014   2000
A         7       2014   3000
B         6       2014   1500
B         7       2014   5000

有谁知道如何使用sql语法解决这个问题? 谢谢。

4 个答案:

答案 0 :(得分:3)

您可以使用相关子查询来获取此信息:

SELECT  T.ID,
        T.GroupID,
        t.oDate,
        T.oValue,
        ct.TotalToEndOfMonth
FROM    T
        OUTER APPLY
        (   SELECT  TotalToEndOfMonth = SUM(oValue)
            FROM    T AS T2
            WHERE   T2.GroupID = T.GroupID
            AND     T2.oDate >= T.oDate
            AND     T2.oDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, T.oDate) + 1, 0)
        ) AS ct;

对于您的示例数据,这给出了:

ID  GROUPID ODATE       OVALUE  TOTALTOENDOFMONTH
1   A       2014-06-01  100     2100
2   A       2014-06-02  200     2000
3   A       2014-06-03  300     1800
4   A       2014-06-04  400     1500
5   A       2014-06-05  500     1100
30  A       2014-06-30  600     600

<强> Example on SQL Fiddle

为了将来参考,如果你曾经升级过,在SQL Server 2012(及更高版本)中,使用允许排序的窗口聚合函数会变得更加容易:

SELECT  T.*,
        TotalToEndOfMonth = SUM(oValue) 
                                OVER (PARTITION BY GroupID, 
                                                    DATEPART(YEAR, oDate), 
                                                    DATEPART(MONTH, oDate) 
                                        ORDER BY oDate DESC)
FROM    T
ORDER BY oDate;

<强> Example on SQL Fiddle

修改

如果您只想在每个月的第2天使用此功能,但仍需要所有字段,那么您只需过滤我发布的第一个查询的结果:

SELECT  T.ID,
        T.GroupID,
        t.oDate,
        T.oValue,
        ct.TotalToEndOfMonth
FROM    T
        OUTER APPLY
        (   SELECT  TotalToEndOfMonth = SUM(oValue)
            FROM    T AS T2
            WHERE   T2.GroupID = T.GroupID
            AND     T2.oDate >= T.oDate
            AND     T2.oDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, T.oDate) + 1, 0)
        ) AS ct
WHERE   DATEPART(DAY, T.oDate) = 2;

<强> Example on SQL Fiddle

如果您只关心总数,那么您可以使用:

SELECT  T.GroupID,
        [Month] = DATEPART(MONTH, oDate),
        [Year] = DATEPART(YEAR, oDate),
        tot_oValue = SUM(T.oValue)
FROM    T
WHERE   DATEPART(DAY, T.oDate) >= 2
GROUP BY T.GroupID, DATEPART(MONTH, oDate), DATEPART(YEAR, oDate);

<强> Example on SQL Fiddle

答案 1 :(得分:1)

如果您希望按GROUPID,年份和月份进行分组,则应执行此操作:

SELECT 
    GROUPID, 
    [MONTH] = MONTH(oDate), 
    [YEAR]  = YEAR(oDate), 
    tot_oValue = SUM(ovalue) 
FROM your_table
WHERE DAY(odate) > 1
GROUP BY GROUPID, YEAR(oDate), MONTH(oDate)
ORDER BY GROUPID, YEAR(oDate), MONTH(oDate)

答案 2 :(得分:1)

不确定您是否拥有不同年份的数据

Select YEAR(oDate),MONTH(oDate),SUM(Value) 
From #Temp
Where DAY(oDate)>1
Group By YEAR(oDate),MONTH(oDate)

答案 3 :(得分:1)

此查询产生所需的输出:

SELECT GROUPID, MONTH(oDate) AS "Month", YEAR(oDate) AS "Year", SUM(oValue) AS tot_oValue
  FROM table_name
  WHERE DAY(oDate) > 1
  GROUP BY GROUPID, YEAR(oDate), MONTH(oDate)
  ORDER BY GROUPID, YEAR(oDate), MONTH(oDate)