【问题标题】:SQL Sum MTD & YTDSQL 总和 MTD 和 YTD
【发布时间】:2014-02-14 17:57:39
【问题描述】:

我才刚刚开始研究 SQL。

我有一个 SQL Server 2008 r2 数据库,它将返回两个字段 DocDate 和 InvValue。我需要将 InvValues 总结为今天日期的 MTD 和 YTD 所以它看起来像

**Period** ///////  **Total value**
MTD        ////////////111111.11
YTD       /////////////999999.99

我已经进行了相当多的谷歌搜索,并且可以使用 SUM 和 DATEPART 进行其中的一项,但我一直在尝试同时进行这两项。

谁能给我一些伪代码,可以帮助我进一步搜索。

谢谢@Gordon Linoff,这对我很有帮助,我学到了一些东西,将来我会觉得很有用。 我的代码现在看起来像:

SELECT
SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) THEN T0.[TotalSumSy] END) AS YTD,
SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) AND MONTH(T1.[DocDate]) = MONTH(GETDATE()) THEN T0.[TotalSumSy] END) AS MTD

FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry]

但是我现在明白了

YTD.........MTD
99999.99....111111.11

我需要

YTD........99999.99
MTD........11111.11

我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    您可以使用条件聚合来做到这一点:

    select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD,
           sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate())
                    then InvValue
               end) as MTD
    from table t;
    

    这假设您在表格中没有未来的日期。如果这样做,请在两个子句中添加docdate < getdate()

    编辑:

    如果你需要两行,你可以这样做:

    select (case when n.n = 1 then 'YTD' else 'MTD' end) as which,
           (case when n.n = 1 then YTD else MTD end) as value
    from (select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD,
                 sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate())
                          then InvValue
                     end) as MTD
          from table t
         ) cross join
         (select 1 as n union all select 2) n;
    

    【讨论】:

    • 谢谢。在我的请求中添加了其他信息。
    【解决方案2】:
    SELECT
      Period = 'MTD',
      Total_value = SUM(T0.TotalSumSy) 
    FROM dbo.INV1  T0 
      INNER JOIN dbo.OINV  T1 
         ON T1.DocEntry = T0.DocEntry
    WHERE 
        T1.DocDate >= DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'20010101')
      AND 
        T1.DocDate < DATEADD(month,1+DATEDIFF(month,'20010101',GETDATE()),'20010101')
    
    UNION ALL
    
    SELECT
      'YTD', 
      SUM(T0.TotalSumSy) 
    FROM dbo.INV1  T0 
      INNER JOIN dbo.OINV  T1 
         ON T1.DocEntry = T0.DocEntry
    WHERE 
        T1.DocDate >= DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20010101')
      AND 
        T1.DocDate < DATEADD(year,1+DATEDIFF(year,'20010101',GETDATE()),'20010101') ;
    

    使用WHERE 子句中的(复杂)条件代替YEAR(column) = YEAR(GETDATE() 和您之前使用的其他条件,因此可以使用索引。将函数应用于列时,会使索引变得不可用(某些函数和 SQL-Server 的某些版本有一些小例外。)所以,最好的办法是尝试将条件转换为这种类型:

    column <operator> AnyComplexFunction()
    

    【讨论】:

    • 谢谢@ypercube。你能解释更多关于 Where 子句的信息吗?我有点困惑。
    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多