Вот две мысли ... Не очень понятно, если я понял случай использования ... Кроме того, это решение будет работать только для SQL 2012 и выше
Так дали таблицу
CREATE TABLE [dbo].[LagExample](
[YearMonth] [nvarchar](100) NOT NULL,
[Sales] [money] NOT NULL
)
Первый один довольно прост и просто предполагает, что вы желая обосновать величину вашего процентного увеличения на сколько дней были до него ...
;WITH cte
as
(
SELECT YearMonth,
ROW_NUMBER() OVER (ORDER BY YearMonth) - 1 AS SalesEntry,
cast(LAG(Sales, 1,Sales) OVER (ORDER BY YearMonth) as float) as Sales
FROM LagExample
)
SELECT YearMonth,
Sales,
cast(Sales * POWER(cast(1.04 as float), SalesEntry) AS decimal(10,2)) as NewSales
FROM cte
второго один использует рекурсивный КТР для вычислить значение по мере продвижения вдоль месяцев .. Вот хорошая ссылка про рекурсивных КТР http://www.codeproject.com/Articles/683011/How-to-use-recursive-CTE-calls-in-T-SQL
;with data
as
(
SELECT Lead(le.YearMonth, 1, null) OVER (ORDER BY le.YearMonth) as NextYearMonth,
cast(le.Sales as Decimal(10,4)) as Sales,
le.YearMonth
FROM LagExample le
)
,cte
as
(
SELECT *
FROM data
Where YearMonth = '201411'
UNION ALL
SELECT
data.NextYearMonth,
cast(cte.Sales * 1.04 as Decimal(10,4)) as Sales,
data.YearMonth
From cte join
data on data.YearMonth = cte.NextYearMonth
)
SELECT YearMonth, cast(Sales as Decimal(10,2))
FROM cte
order by YearMonth
Что тип данных столбца годМесяц? Char или целое число? Всегда ли YearMonth постоянно? Если нет, как рассчитать следующие продажи после пробела? –
Месяц 07/2015 имеет продажи = 100, таким образом, следующий месяц 08/2015 должен иметь продажи = 104, а не 142.33. –
Дополнительные 4% на 100 будут равны 104 для всех значений. Вы не упомянули, чтобы рассчитать стоимость новой продажи. –