SQL Sum MTD&年初至今

时间:2014-02-14 17:57:40

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

我刚刚开始研究SQL。

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

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

我已经做了相当多的谷歌搜索,可以用SUM&amp ;;做一个或者另一个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

任何进一步的帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以使用条件聚合执行此操作:

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;

答案 1 :(得分:1)

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的verios,会有一些小的例外。)因此,最好的方法是尝试将条件转换为此类型:

column <operator> AnyComplexFunction()