1

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

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

我试图比较每个季度的销售额增长,所以我想得到这样的结果:

Q1 Q2 Sales Difference
 4  1      1111
 1  2      1111

我很难想出一种方法来比较上一年的第四季度和明年的第一季度。

我在这里设置了一个带有类似表的 SQLFiddle 以及适用于同一年各季度的解决方案。

4

3 回答 3

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 ......)

于 2013-02-21T20:44:48.720 回答
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 好还是差。它对表进行的扫描少了一次,但对索引的扫描可能不会那么好。我很想知道它在一个更大的例子中是如何做的。

于 2013-02-21T20:49:19.717 回答
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

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

于 2013-02-21T22:35:06.680 回答