我在SQL Server 2005数据库中有一个表,其中包含以下列:
标识,产品名称,年份,一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月
我需要做的是计算产品的平均ROLLING值。
例如,如果名为“Car”的产品在表格中有2行(2009年和2010年),我想计算从2009年8月到2010年8月或2009年3月到2010年3月的平均值。
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
使用Sql Server 2005,您可以查看UNPIVOT。
将它们放回到属于它们的行中后,您就可以开始使用数据了。
像
这样的东西DECLARE @Table TABLE(
Id INT,
ProductName VARCHAR(20),
[Year] INT,
Jan FLOAT,
Feb FLOAT,
Mar FLOAT,
Apr FLOAT,
May FLOAT,
Jun FLOAT,
Jul FLOAT,
Aug FLOAT,
Sep FLOAT,
Oct FLOAT,
Nov FLOAT,
[Dec] FLOAT
)
INSERT INTO @Table SELECT 1,'Car',2009,1,2,3,4,5,6,7,8,9,10,11,12
INSERT INTO @Table SELECT 1,'Car',2010,1,2,3,4,5,6,7,8,9,10,11,12
SELECT Id,
ProductName,
CAST(YearMonth + ' ' + CAST([Year] AS VARCHAR(4)) AS DATETIME) MonthDate,
Vals
FROM (
SELECT Id,ProductName,[Year],Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,[Dec]
FROM @Table
) tbl
UNPIVOT (Vals FOR YearMonth IN (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,[Dec])) as unpvt
答案 1 :(得分:0)
这是一个可行的解决方案
WITH MyProducts AS
(
SELECT [Id], [ProductName],
CAST([MONTH] + ' 1, ' + CAST([Year] AS varchar) AS datetime) as [MyDate], [MyValues]
FROM ( SELECT Id,ProductName,[Year],[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
FROM [SourceTable] ) MyTable
UNPIVOT ([MyValues] FOR [Month] IN
([Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])) AS [pivot]
)
SELECT mp1.[ProductName], mp1.[MyDate], AVG(mp2.[MyValues]) AS MyValues
FROM [MyProducts] AS mp1
JOIN [MyProducts] AS mp2 ON mp2.MyDate BETWEEN DATEADD(MM, -11, mp1.[MyDate]) AND mp1.[MyDate]
WHERE mp1.[MyDate] BETWEEN '3/1/2010' AND '8/1/2010'
GROUP BY mp1.[ProductName], mp1.[MyDate]
ORDER BY mp1.[ProductName], mp1.[MyDate]