假设我有一个名为Sales的表,它看起来像这样:
Year Quarter Sales
2012 4 5000
2013 1 6111
2013 2 7222
我正试图比较每个季度的销售额增长,所以我想得出这样的结果:
Q1 Q2 Sales Difference
4 1 1111
1 2 1111
我很难想出一种方法来比较去年第四季度和明年第一季度。
我在这里用类似的表建立了一个SQLFiddle,以及适用于同一年内季度的解决方案。
怎么样:
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年第5季度更改为第1季度…)
另一个选项
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。它对表的扫描次数减少了一次,但可能在索引方面做得不太好。我很想看看它在一个更大的例子中是怎么做的。
我发现使用CTE有助于保持代码的有序和干净。您需要重新格式化数字并将第四季度与明年第一季度进行匹配的混乱部分可以在那里处理,您的主要查询也很简单。
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
我在四分之一的格式和百分比计算方面添加了一些技巧(最低限度:),您可以使用这些示例来帮助自定义您想要的输出。