[英]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.