我知道之前已经问过这个问题,但没有一个答案对我有意义。希望有人能够更清楚地解释。
我的数据:
year quarter month item sales quantity month_number
2011 1 January a 4250 85000 1
2011 1 February a 4600 92000 2
2011 1 March a 3700 74000 3
2011 2 April a 4215 84300 4
2011 2 May a 5120 102400 5
2011 2 June a 5010 100200 6
2011 3 July a 4690 93800 7
2011 3 August a 4900 98000 8
2011 3 September a 5400 108000 9
2011 4 October a 5820 116400 10
2011 4 November a 5900 118000 11
2011 4 December a 5730 114600 12
2011 1 January b 1417 35417 1
2011 1 February b 1533 38333 2
2011 1 March b 1233 30833 3
2011 2 April b 1405 35125 4
2011 2 May b 1707 42667 5
2011 2 June b 1670 41750 6
2011 3 July b 1563 39083 7
2011 3 August b 1633 40833 8
2011 3 September b 1800 45000 9
2011 4 October b 1940 48500 10
2011 4 November b 1967 49167 11
2011 4 December b 1910 47750 12
我正在尝试在最后创建一个新列,其中包含每个项目(a& b)每个月的销售变化百分比。因此,month_number 1s都是空值,因为没有变化。但是month_number 2应该等于(4600 - 4250)/ 4250,即0.082。 等等。
有什么想法?提前致谢。
答案 0 :(得分:2)
SELECT
t1.*
,CASE
WHEN t2.sales IS NULL THEN NULL
ELSE (t1.sales - t2.sales) / (t2.sales * 1.00)
END AS MonthOverMonth
FROM
#TblName t1
LEFT JOIN #TblName t2
ON t1.[Year] = t2.[Year]
AND t1.month_number - 1 = t2.month_number
AND t1.item = t2.item
Gordon的LAG答案与我想的方式相同,但我正在编写非窗口函数版本,以防你说mysql的东西。无论如何,LAG答案在SQL 2012 +中。 SELECT @@VERSION
应告诉您正在使用的MSSQL版本。但即使没有它,你也可以自己加入前一个月并进行计算。
答案 1 :(得分:0)
您尚未使用数据库标记您的问题,因此这符合ANSI标准功能。大多数数据库都支持lag()
:
select d.*, (sales - prev_sales) / (prev_sales * 1.0)
from (select d.*
lag(sales) over (partition by item order by year, month) as prev_sales
from mydata md
) d;