Это в основном из-за того, что вы просто не используете значения даты в качестве даты.
Логика даты, которая вам нужна, чтобы найти разницу в месяцах между произвольной датой и invoicedate
, а затем добавить эту разницу вмесяцев до той же произвольной даты, чтобы получить первый день этого месяца.Затем вы можете добавить или вычесть это различие, чтобы найти месяцы до или после.
Вы можете увидеть, как это работает, поиграв со следующим:
select getdate() as RightNow
,dateadd(day, datediff(day , 0, getdate()) , 0) as DayStart
,dateadd(month,datediff(month, 0, getdate())-1, 0) as PreviousMonthStart
,dateadd(month,datediff(month, 0, getdate()) , 0) as MonthStart
,dateadd(month,datediff(month, 0, getdate())+1, 0) as NextMonthStart
Следующее должно работать не только длявы, но выполняете меньше времени из-за отсутствия функций в ваших where
предложениях:
with _t1 as
(
select dateadd(month,datediff(month,0,Invoicedate),0) as InvoiceMonth
,sum([TaxableSalesAmt]
+[NonTaxableSalesAmt]
+[FreightAmt]
+[SalesTaxAmt]
) as Revenue
from [InvoiceHistory]
where invoicedate >= '20150101'
group by dateadd(month,datediff(month,0,Invoicedate),0)
)
,_t2 as
(
select dateadd(month,datediff(month,0,Invoicedate),0) as InvoiceMonth
,dateadd(month,datediff(month,0,Invoicedate)-1,0) as PreviousInvoiceMonth
,sum([TaxableSalesAmt]
+[NonTaxableSalesAmt]
+[FreightAmt]
+[SalesTaxAmt]
) as Revenue
from [MAS_RDP].[dbo].[AR_InvoiceHistoryHeader]
where invoicedate >= '20150101'
group by dateadd(month,datediff(month,0,Invoicedate),0)
,dateadd(month,datediff(month,0,Invoicedate)-1,0)
)
select _t1.InvoiceMonth
,_t1.Revenue
,_t2.PreviousInvoiceMonth
,_t2.Revenue
,_t2.Revenue-_t1.Revenue as GrowthActual
,(_t2.Revenue - _t1.Revenue)/_t2.Revenue*100 as GrowthPercent
from _t1
inner join _t2
on _t1.InvoiceMonth = _t2.PreviousInvoiceMonth
order by _t1.InvoiceMonth