首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Sum MTD和YTD

SQL Sum MTD和YTD
EN

Stack Overflow用户
提问于 2014-02-15 01:57:40
回答 2查看 18.2K关注 0票数 5

我才刚刚开始研究SQL。

我有一个SQL Server2008 r2数据库,它将返回两个字段DocDate和InvValue。我需要将截至今天的日期的InvValues合计为MTD和YTD,因此看起来如下所示

代码语言:javascript
复制
**Period** ///////  **Total value**
MTD        ////////////111111.11
YTD       /////////////999999.99

我已经做了相当多的谷歌搜索,可以用SUM & DATEPART做其中之一,但我被困住了,试图同时做这两件事。

谁能给我一些伪代码,可以帮助我进一步谷歌。

谢谢你@戈登·林诺夫,这帮了我很大的忙,我学到了一些东西,将来我会发现有用的。我的代码现在看起来像这样:

代码语言:javascript
复制
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]

然而,我现在得到了

代码语言:javascript
复制
YTD.........MTD
99999.99....111111.11

我需要

代码语言:javascript
复制
YTD........99999.99
MTD........11111.11

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-15 03:42:56

代码语言:javascript
复制
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()和其他条件,因此可以使用索引。WHen将函数应用于列时,会使索引变得不合适(对于某些函数和SQL-Server的一些verios,有一些小例外)。因此,最好的方法是尝试将条件转换为这种类型:

代码语言:javascript
复制
column <operator> AnyComplexFunction()
票数 1
EN

Stack Overflow用户

发布于 2014-02-15 02:04:03

您可以使用条件聚合来完成此操作:

代码语言:javascript
复制
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()添加到这两个子句中。

编辑:

如果您需要两行代码,您可以简单地执行以下操作:

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21786302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档