2017-02-16 52 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年11月,2016年12月,2017年1月,因此上一年的数字在11月和12月不适用,并且在我将年份追加到年底的日期栏中显示为2017年11月。我手动添加了一年,因为如果我没有,我每年都有单独的行,并且当年和上年的数字不会出现在同一行上。

+1

将是有益的,如果你能提供一些示例数据和你会从示例数据所期望的结果。 –

+0

我不明白这句话:“收入数字不加在所需的输出或样本数据中,请假装他们这样做”。当他们没有总结时,输出中应该显示什么数字? –

+0

@StefanSteinegger我只是编写了一些随机的输入数据,如果你添加了它,它将不会加到你想要的输出上,它会在实际的实时数据中,这只是为了快速解释问题。 – 80gm2

回答

1

你可以访问最后一行并使用子查询,但我无法告诉你它是如何工作的。

如果年份是数字(使用convert实际上表明这一点),您可以做一个花哨的外连接。

创建一个包含每年和每月单行的视图可能是有意义的。如果您不想要该视图,则可以将其替换为相应的子查询。

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

我会在FROM部分下放一个WHERE子句来指定一个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)