2017-02-16 33 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)