2014-02-14 135 views
5

我剛剛開始研究SQL。SQL總和MTD&YTD

我有一個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 

任何進一步的援助將不勝感激。

回答

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的一些小例外)。因此,最好的辦法是嘗試將條件轉換爲此類型:

column <operator> AnyComplexFunction() 
+0

謝謝@ypercube。你能解釋更多關於Where子句嗎?我有點困惑。 – user2694771

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; 
+0

謝謝。在我的請求中添加了其他信息。 – user2694771