2013-02-21 50 views
1

比較說我有一個表名爲Sales,看起來像這樣:從Q4季度銷售到Q1

Year Quarter Sales 
2012 4  5000 
2013 1  6111 
2013 2  7222 

而且我想從季度季度銷售額的增長比較,所以我要結束了像這樣的東西:

Q1 Q2 Sales Difference 
4 1  1111 
1 2  1111 

我有想出一個方法來比較上年四季度與明年第一季度的麻煩。

我已經建立了一個SQLFiddle與類似的表here,以及在同一年內爲宿舍工作的解決方案。

回答

2

如何:

select a.Year, a.Quarter as Q1, ISNULL(b.Quarter, c.Quarter) as Q2, ISNULL(b.Sales, c.Sales) - a.Sales AS [Sales Increase] 
from Sales a 
left join Sales b on a.Quarter = b.Quarter - 1 and a.Year = b.Year 
left join Sales c on a.Quarter = 4 and c.Quarter = 1 and a.Year = c.Year - 1 

SQL Fiddle(雖然改變2014 Q5到Q1 ...)

+0

哈!第5季度的好消息......哎呀! – digitalfrenchfry 2013-02-21 20:54:22

2

另一種選擇

WITH QuarterlySales AS (
    SELECT Sales.Quarter, Sales.Year, DateAdd(q,Sales.Quarter,CAST('01/01/'+CAST(YEAR AS CHAR(4)) AS DATE)) AS QDate 
     , Sales 
    FROM Sales) 
SELECT b.[Quarter] as [Q1], a.[Quarter] AS [Q2], 
     a.Sales - b.Sales AS [Sales Increase] 
FROM QuarterlySales a 
LEFT JOIN QuarterlySales b 
    ON a.[QDate] = DateAdd(q,1,b.[QDate]) 

不知道這個性能是好還是壞比@chrisb。它可以少掃描一次表格,但可能不會很好地處理索引。我很想知道它是如何在一個更大的例子上做的。

1

我發現使用CTE有助於保持代碼的組織和清潔。您需要重新格式化數字並與第二季度Q1相匹配的雜亂部分可以在那裏處理,您的主要查詢很簡單。

with NewSales (QtrDate, DisplayDate, Year, Quarter, Sales) as (
    select 
     Year - 0.25 + (Quarter/4.0) as QtrDate, 
     cast(Year as varchar(10)) + '-Q' + cast(Quarter as varchar(10)) as DisplayDate, 
     Year, Quarter, Sales 
    from 
     @sales 
) 



select 
    a.DisplayDate, a.Sales, 
    b.DisplayDate, b.Sales, 
    b.Sales - a.Sales as SalesIncrease, 
    (b.Sales/(a.Sales * 1.0)) - 1 as SalesPctIncrease 

from 
    NewSales a left outer join 
    NewSales b on a.QtrDate + 0.25 = b.QtrDate 

where 
    a.Sales is not null and b.Sales is not null 

我平添了幾分風騷的(最低限度:)同宿舍的格式和百分比計算,你可以使用這些例子來幫助自定義輸出,只要你願意。