【问题标题】:How to show YTD last year vs Same period this year如何显示去年年初至今与今年同期
【发布时间】:2016-11-08 23:39:43
【问题描述】:

我有这个查询显示从 2016 年这个月到 2015 年同月的相同天数,

但我需要显示 YTD

Ene、feb、mar、apr、may、jun,截至 2015 年 7 月 6 日和 2016 年同期(因为今天是 6 日,明天是 7 日,然后是 7 月 8 日,依此类推)含义类似于代码 i有,但不是只显示当前月份,而是需要 YTD。

SELECT        OrderStatus, Sum_SellPrice, Sum_SellerMargin, Sum_BuyPrice, OrderDate
FROM            Sum_OrderCharges
WHERE        (OrderStatus IN ('Completed', 'Invoiced', 'Open')) 
AND (OrderPeriodYear IN ('2015','2016')) 
AND (MONTH(OrderDate) = MONTH(GETDATE())) 
and (day(OrderDate) <= DAY(GETDATE())) 
ORDER BY OrderDate

【问题讨论】:

  • AND (MONTH(OrderDate) &lt;= MONTH(GETDATE()))?
  • @PeterVandivier 由于day 部分,这将无法正常工作。如果当天是 15 号,则只会拉取前几个月的 1-15 号。
  • 你可能想这样做.. select to_char(trunc(sysdate),'YYYYMMDD') as ytd from dual; select to_char(trunc(sysdate),'YYYYMMDD')-10000 as ytd from dual;

标签: sql sql-server-2008 date


【解决方案1】:

为此添加 OR 声明:

OR MONTH(OrderDate) &lt;= MONTH(GETDATE())

SELECT OrderStatus, Sum_SellPrice, Sum_SellerMargin, Sum_BuyPrice, OrderDate
FROM   Sum_OrderCharges
WHERE  OrderStatus IN ('Completed', 'Invoiced', 'Open') 
AND OrderPeriodYear IN ('2015','2016')
AND ( (MONTH(OrderDate) = MONTH(GETDATE()) AND day(OrderDate) <= DAY(GETDATE()))
    OR MONTH(OrderDate) <= MONTH(GETDATE())  )--Be sure to wrap the entire OR segment with ()
ORDER BY OrderDate

【讨论】:

  • 打败了我,我被另一个答案迷住了 :) 只有 1 条评论我会包装 MONTH(OrderDate) = MONTH(GETDATE()) AND day(OrderDate)
  • @Matt 我试图离开它,但不确定你是否正在重写。^^ 我有 AND..OR 包装,虽然很难看到所有括号。
  • 不用担心 Arron 很高兴您提供帮助。你有整个和或包装,但我建议也包装第一部分。这样,它将 OR 条件的两侧分开。这样做: AND ((MONTH(OrderDate) = MONTH(GETDATE()) AND day(OrderDate)
  • 大家好,感谢您的帮助,但这仍然显示 2015 年 7 月的整个月份,我只需要显示 2016 年 2015 年过去的日子,这意味着它应该显示 6 天2015 年 7 月。
  • @AbleTech 哦,改成OR MONTH(OrderDate) &lt; MONTH(GETDATE())。只需&lt; 而不是&lt;=
【解决方案2】:

使用 CTE 准备和使用日期窗口更加优雅。这是一个例子。

declare @start as date='2016-01-01', @end date=getdate(),@depth int = 2

;with dates as (--prepare date ranges
--anchor query
select @start startDate, @end endDate, 1 cnt
union all
--recursive query 
select dateadd(year,-1,startDate),dateadd(year,-1,endDate), cnt+1
from dates where cnt < @depth
)
select d.startDate,d.endDate, 
OrderStatus, Sum_SellPrice, Sum_SellerMargin, Sum_BuyPrice --aggregate if necessary
from Sum_OrderCharges o
inner join dates d on o.OrderDate between d.startDate and d.endDate
WHERE (OrderStatus IN ('Completed', 'Invoiced', 'Open')) 

这样您甚至可以比较日期范围,例如 2015-11-01 到 2016-07-05 和 2014-11-01 到 2015-07-05。

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多