2010-08-12 2 views
2

У меня есть таблица в SQL Server базы данных 2005, которая имеет следующие столбцы:Рассчитать прокатный месяц стоимость в SQL Server

Id, ProductName, год, январь, февраль, март, апрель, май, июнь, июль, август, Sep, Oct, Nov, Dec

Что мне нужно сделать, так это рассчитать среднее значение ROLLING для продукта.

Например, если продукт под названием «Автомобиль» имеет 2 строки в таблице (2009 год и 2010) Я хочу, чтобы рассчитать средние значения с августа 2009 года по август 2010 года или в марте 2009 года по март 2010 года

Что такое лучший способ добиться этого?

+3

, если у вас эти колонки в качестве строк в таблице, это было бы легче получить значение, которое вы ожидаете. –

+4

Возможно, использовать подходящую модель данных? Столбцы, которые носят названия месяцев, просто кричат ​​о плохом дизайне; столбцы должны быть ID, ProductName, Year, Month. Тогда всевозможные вычисления будут легкими. – tdammers

+2

Почему бы вам просто не хранить дату, а не год и месяц? Если это последний день месяца, вы можете сделать другие расчеты времени намного проще (среднесуточный). – JeffO

ответ

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 
+0

Спасибо за ваш ответ! Это именно то, что я искал! – igorti

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] 
Смежные вопросы