【问题标题】:How to reset the month to date running total如何重置当月至今的总计
【发布时间】:2016-08-10 10:58:57
【问题描述】:
SELECT DISTINCT
    ACCOUNTDATE,
    PROPERTYNAME,
    rt.management
FROM 
    aaa t
CROSS APPLY
    (SELECT 
         SUM(MANAGEMENT) AS management
     FROM
         aaa
     WHERE
         PROPERTYNAME = t.PROPERTYNAME 
         AND ACCOUNTDATE <= t.ACCOUNTDATE) as rt
WHERE 
    AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
ORDER BY 
    AccountDate

这是我的查询,我想计算本月至今的总和, 例如:1/08/2016-31/08/2016 的总和必须从 1/09/2016-31/09/2016 的开头重新设置。

但根据上述查询,我​​无法重置下个月的总计。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql-server sql-server-2008 tsql business-intelligence


【解决方案1】:

如果您想要运行总计,那么在 SQL Server 2012+ 中,您可以使用:

select aaa.*,
       sum(management) over (partition by year(accountdate), month(accountdate)
                             order by accountdate
                            ) as rt
from aaa
where AccountDate between @STARTOFMONTH_MAN and @ENDOFMONTH_MAN
order by Accountdate;

在早期版本中,您可以使用 cross apply 并在逻辑中包含年份和月份:

SELECT t.*, rt.management
from aaa t cross apply     
     (select SUM(MANAGEMENT) as management
      from aaa t2
      where t2.PROPERTYNAME = t.PROPERTYNAME and
            year(t2.accountdate) = year(t.accountdate) and
            month(t2.accountdate) = month(t.accountdate) and
            t2.ACCOUNTDATE <= t.ACCOUNTDATE 
      ) rt
WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
ORDER BY AccountDate;

【讨论】:

  • 感谢您的帮助.. 但我使用的是 SQL Server 2008。
  • @Swe 。 . .第二种解决方案适用于 SQL Server 2008。
  • @gordon linoff,如果我们在 where 条件下使用月份和年份函数,那么查询性能是否会受到影响?
【解决方案2】:

如果您不使用 SQL-Server 2012+,则必须使用相关查询(或某种其他联接):

SELECT DISTINCT t.ACCOUNTDATE
       ,t.PROPERTYNAME
       ,(SELECT SUM(s.MANAGMENT) FROM aaa s
         WHERE MONTH(t.accountdate) = MONTH(s.accountdate)
           AND YEAR(t.accountdate) = YEAR(s.accountdate)
           AND  s.PROPERTYNAME = t.PROPERTYNAME) as rt
from aaa t
WHERE t.AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
ORDER BY t.AccountDate

【讨论】:

    【解决方案3】:

    试试

    SELECT DISTINCT
        ACCOUNTDATE
        ,PROPERTYNAME
        ,rt.management
    from aaa t
    cross apply     
        (select SUM(MANAGEMENT) as management
         from aaa
         where 
         PROPERTYNAME = t.PROPERTYNAME and
         ACCOUNTDATE BETWEEN dateadd(MONTH, datediff(MONTH, 0,t.ACCOUNTDATE),0) -- start of month
    AND t.ACCOUNTDATE 
        ) as rt
    WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
    ORDER BY AccountDate
    

    【讨论】:

    • 我不确定 datediff 在 SQL-Server 中的工作方式。 31-01-201601-02-2016 之间的月差将是 1?
    • @sagi,它将是 1
    • 如何 5?不,我是指一个月的最后一天和下个月的第一天(相差1天,但月份不同)
    • 是的,大约 10 秒 :D,好的,我只是想确定一下。
    【解决方案4】:
    SELECT DISTINCT
        ACCOUNTDATE
        ,PROPERTYNAME
        ,rt.management
    from aaa t
    cross apply     
        (select SUM(MANAGEMENT) as management
         from aaa
         where 
         PROPERTYNAME = t.PROPERTYNAME and
         ACCOUNTDATE BETWEEN dateadd(MONTH, datediff(MONTH, 0,t.ACCOUNTDATE),0) -- start of month
    AND t.ACCOUNTDATE 
        ) as rt
    WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
    ORDER BY AccountDate
    

    【讨论】:

      【解决方案5】:

      为了始终给出该项目所在月份的累计总数,试试这个 - 它可以避免对之前任何月份的帐户求和

          SELECT DISTINCT
          ACCOUNTDATE,
          PROPERTYNAME,
          rt.management
      FROM 
          aaa t
      CROSS APPLY
          (SELECT 
               SUM(MANAGEMENT) AS management
           FROM
               aaa
           WHERE
               PROPERTYNAME = t.PROPERTYNAME 
               AND ACCOUNTDATE <= t.ACCOUNTDATE 
               and MONTH(accountdate) = MONTH(t.accountdate) 
               and year(accountdate) = year(t.accountdate)) as rt
      WHERE 
          AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
      ORDER BY 
          AccountDate
      

      在 4 月开始的财政年度试试这个

          SELECT DISTINCT
          ACCOUNTDATE,
          PROPERTYNAME,
          rt.management,
          fy.managementFinancialYear
      FROM 
          aaa t
      CROSS APPLY
          (SELECT 
               SUM(MANAGEMENT) AS management
           FROM
               aaa
           WHERE
               PROPERTYNAME = t.PROPERTYNAME 
               AND ACCOUNTDATE <= t.ACCOUNTDATE 
               and MONTH(accountdate) = MONTH(t.accountdate) 
               and year(accountdate) = year(t.accountdate)) as rt
      CROSS APPLY
          (SELECT 
               SUM(MANAGEMENT) AS managementFinancialYear
           FROM
               aaa
           WHERE
               PROPERTYNAME = t.PROPERTYNAME 
               AND ACCOUNTDATE <= t.ACCOUNTDATE 
               and (year(accountdate) * 12 + MONTH(accountdate) - 4) % 12  = (year(t.accountdate) * 12 + MONTH(t.accountdate) - 4) % 12 
               )as fy
      WHERE 
          AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN
      ORDER BY 
          AccountDate
      

      【讨论】:

      • 对于同一个查询,我怎样才能得到财政年度的总和?例如:从 01/04/2015-31/03/2016?
      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多