2017-02-16 3 views
1

мне нужно рассчитать доход за текущий год и предыдущий год, мой желаемый результат заключается в следующем:Как рассчитать доход за предыдущий год в моем запросе?

Date   revenue_current revenue_previous 

January-2017  350    450 

December-2016  750    250 

November-2016  4550    4230 

(Предыдущий доход год в том же месяце в прошлом году)

данных:

SaleDate_Yr | SaleDate_Pd | Revenue 

2017    1   100 

2017    1   200 

2017    1   300 

2016    11  100 

2016    11   50 

2017    1   50 

2016    12  50 

2016    12  50 

2016    1   100 

2015    11  300 

2015    12  520 

2016    1   100 

(Номера доходов не складываются в желаемый результат или данные образца, пожалуйста, притворитесь ими).

Мой запрос до сих пор:

SELECT (CONVERT(varchar(10), SaleDate_Pd) + '-' + '2017') AS sale_pd, 

SUM(CASE WHEN SaleDate_Yr IN ('2017') THEN Total_Revenue ELSE 0 END) 
as revenue_ty, 

SUM(CASE WHEN SaleDate_Yr IN ('2016') THEN Total_Revenue ELSE 0 END) as revenue_ly 

FROM 

[sales].[dbo].[mycompany] 

WHERE 

SaleDate_Yr IN ('2016', '2017') 
AND 
SaleDate_Pd IN ('11','12','1') 

GROUP BY (CONVERT(varchar(10), SaleDate_Pd) + '-' + '2017') 

Это, кажется, работает прекрасно, если я смотрю на продажи с января 2017 года по декабрь 2017. Однако иногда я хочу посмотреть на определенный период времени, например ноября 2016 года, декабрь 2016 года , Январь 2017 года, поэтому показатель предыдущего года не будет работать в ноябрьские и декабрьские даты, а также появится в ноябре-2017 году в столбце даты, где я добавляю год до конца. Я вручную добавил год, потому что, если бы у меня не было отдельных строк за каждый год, а цифры текущего года и предыдущего года не появлялись бы в одной строке.

+1

Было бы полезно, если бы вы могли предоставить некоторые примеры данных и результаты, которые вы ожидали бы от того, что, например, данные. –

+0

Я не понимаю этого предложения: «Номера доходов не складываются в желаемом выпуске или данные образца, пожалуйста, притворяйтесь, что они делают». Какой номер должен отображаться на выходе, если они не суммируются? –

+0

@StefanSteinegger Я только что составил некоторые случайные входные данные, это не добавило бы желаемого результата, если бы вы добавили его, это было бы в реальных живых данных, это было просто для быстроты при объяснении вопроса. – 80gm2

ответ

1

Вы можете получить доступ к последней строке и работать с подзапросами, но я не могу сказать вам, как это работает наизусть.

Если год будет номером (использование конверта на самом деле предполагает это), вы можете сделать причудливое внешнее соединение.

Может иметь смысл создать представление, которое содержит одну строку для каждого года и месяца. Если вы не хотите просмотра, вы можете заменить его соответствующим подзапросом.

CREATE VIEW revenue_per_month AS 
select 
    SaleDate_Pd, 
    SaleDate_Yr, 
    /* Probably it's not summed, you need to write the query the 
    way that you know the monthly revenue */ 
    SUM(Revenue) 
from mycompany 
group by SaleDate_Pd, SaleDate_Yr 

select 
    CONVERT(varchar(10), thisYear.SaleDate_Pd) 
    + '-' 
    + CONVERT(varchar(10), thisYear.SaleDate_Yr) as Date, 
    thisYear.Revenue as revenue_current, 
    lastYear.Revenue as revenue_previous 
FROM revenue_per_month thisYear 
    left outer join revenue_per_month lastYear 
    on (
     thisYear.SaleDate_Yr - 1 = lastYear.SaleDate_Yr 
     AND thisYear.SaleDate_Pd = lastYear.SaleDate_Pd) 
+0

Я бы поставил предложение WHERE в разделе FROM, чтобы указать SaleDate_Yr? И будет ли в этом году 2017 год? – 80gm2

+0

Вы можете фильтровать 'thisYear.saleDate_Yr' и' thisYear.saleDate_Pd', если хотите. –

+0

Не могли бы вы объяснить функцию MIN() в этом случае, пожалуйста? – 80gm2

0
Create Table R 
    (y Int, m Int, r int) 

Insert Into R Values 
    (2017, 1, 11000) 
    ,(2016, 12, 1200) 
    ,(2016, 11, 1100) 
    ,(2016, 10, 500) 
    ,(2016, 10, 500) 
    ,(2016, 9, 900) 
    ,(2016, 8, 800) 
    ,(2016, 7, 700) 
    ,(2016, 6, 600) 
    ,(2016, 5, 250) 
    ,(2016, 5, 250) 
    ,(2016, 4, 300) 
    ,(2016, 4, 100) 
    ,(2016, 3, 300) 
    ,(2016, 2, 200) 
    ,(2016, 1, 100) 
    ,(2015, 12, 12) 
    ,(2015, 11, 5) 
    ,(2015, 11, 6) 
    ,(2015, 10, 10) 
    ,(2015, 9, 9) 
; 

With _r(y ,m, r, D) 
    As 
     (
      Select y, m, Sum(r), Cast(Cast(y As Char(4)) + Right('0' + Cast(m AS VarChar(2)), 2) + '01' As Date) 
       From r 
       Group 
       By  y, m 
    ) 
Select pc.y As Year, pc.m As Month, pc.r As Revenue_Current, IsNull(pp.r, 0) As Revenue_Previous 
    From _r As pc 
    Left 
    Join _r As pp 
    On  pp.d = DateAdd(Year, -1, pc.d) 
    Where pc.D Between '20161001' And '20170101' 
    Order 
    By Pc.d; 


(21 row(s) affected) 
Year  Month  Revenue_Current Revenue_Previous 
----------- ----------- --------------- ---------------- 
2016  10   1000   10 
2016  11   1100   11 
2016  12   1200   12 
2017  1   11000   100 

(4 row(s) affected)