一尘不染

SQL总和MTD和YTD

sql

我才刚刚开始研究SQL。

我有一个SQL Server 2008r2数据库,它将返回两个字段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

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


阅读 345

收藏
2021-05-23

共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()
2021-05-23