假设我有一个名为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,以及适用于同一季度的解决方案。
答案 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
我添加了一些天赋(最低限度:)以及季度格式和百分比计算,您可以使用这些示例来帮助您根据需要自定义输出。