簡體   English   中英

SQL Sum MTD和YTD

[英]SQL Sum MTD & YTD

我才剛剛開始研究SQL。

我有一個SQL Server 2008 r2數據庫,它將返回兩個字段DocDate和InvValue。 我需要將InvValues匯總為今天的MTD和YTD,所以看起來像

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

我已經做了大量的Google搜尋,並且可以使用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

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

您可以使用條件聚合來做到這一點:

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;
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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM