比较从第四季度到第一季度的季度销售额

时间:2013-02-21 20:24:00

标签: sql-server sql-server-2008

假设我有一个名为Sales的表,如下所示:

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

我正在尝试比较每季度的销售增长,所以我想最终得到这样的结果:

Q1 Q2 Sales Difference
 4  1      1111
 1  2      1111

我很难找到一种方法来比较前一年的Q4和明年的Q1。

我已经设置了一个带有类似表here的SQLFiddle,以及适用于同一季度的解决方案。

3 个答案:

答案 0 :(得分: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年第五季度改为Q1 ......)

答案 1 :(得分: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更好或更差。它少了一次扫描表,但可能不会与索引一样。我很想知道它在一个更大的例子中是如何做的。

答案 2 :(得分:1)

我发现使用CTE有助于保持代码整洁有序。您需要重新格式化数字并将Q4与下一年的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

我添加了一些天赋(最低限度:)以及季度格式和百分比计算,您可以使用这些示例来帮助您根据需要自定义输出。