2016-07-06 3 views
1

у меня есть этот запрос, который показал мне один и тот же период дней с этого месяца 2016 года и в том же месяце 2015 года,Как показать YTD в прошлом году против Тот же период в этом году

Но мне нужно, чтобы показать YTD

Ene, feb, mar, apr, may, jun, до 6 июля 2015 года и в том же периоде 2016 года (потому что сегодня 6-е и завтрашнее шоу 7-е, а затем 8-е июля и т. Д.). Это то, что похоже на код, который у меня есть вместо того, чтобы показывать мне только текущий месяц, мне нужен 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 
+0

'AND (MONTH (OrderDate) <= MONTH (GETDATE()))'? –

+0

@PeterVandivier Это не будет работать из-за «дневной» части. Если наступит день 15-го, только 1-го-15-го потянет за предыдущие месяцы. –

+0

вы можете сделать это. выберите to_char (trunc (sysdate), 'YYYYMMDD') как ytd from dual; выберите to_char (trunc (sysdate), 'YYYYMMDD') - 10000 как ytd из dual; – Spider

ответ

2

Добавить OR заявление для покрытия этого:

OR MONTH(OrderDate) <= 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 
+0

избили меня, я получил ответ от другого ответа :) Только 1 комментарий Я бы обернул МЕСЯЦ (OrderDate) = MONTH (GETDATE()) И день (OrderDate) <= DAY (GETDATE()) в круглых скобках, так что AND/OR в месяц/день понятны. И имеет приоритет в SQL, но мое личное предпочтение всегда заключается в том, чтобы установить приоритет по скобкам – Matt

+0

@Matt Я попытался оставить его, но не был уверен, что вы переписываете или нет. ^^ У меня есть 'AND..OR' завернутый, хотя это трудно увидеть со всеми скобками. –

+0

Не беспокойтесь, Аррон Рад, что вы помогли. у вас есть все и/или завернутый, но я бы рекомендовал также обернуть первую часть AND. Таким образом, он разделяет обе стороны условия ИЛИ. выполните следующие действия: AND ((MONTH (OrderDate) = MONTH (GETDATE()) AND day (OrderDate) <= ДЕНЬ (GETDATE())) ИЛИ МЕСЯЦ (OrderDate) <= МЕСЯЦ (GETDATE())) – Matt

0

Это более элегантный подготовить и даты использования окон с помощью КТР. Это пример.

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.

Смежные вопросы