我正在嘗試根據年度銷售增長預期來計算年度預期銷售量。在一張表中,我有實際銷量:
create table #Sales (
ProductId int,
Year int,
GrowthRate float
)
insert into #Sales
values
(1, 2021, 1000),
(2, 2021, 5000)
在另一個表中,我有年增長率:
create table #GrowthRates (
ProductId int,
Year int,
GrowthRate float
)
insert into #GrowthRates
values
(1, 2022, 0.02),
(1, 2023, 0.04),
(1, 2024, 0.03),
(1, 2025, 0.05),
(2, 2022, 0.10),
(2, 2023, 0.12),
(2, 2024, 0.05),
(2, 2025, 0.09)
有沒有辦法計算Sales2022 = Sales2021 * (1 GrowthRate2022),并計算另一行Sales 2023 = Sales2022(from previously) * (1 GrowthRate2023)等等,直到 2025 年全部在 select 陳述句中完成。也許是一個回圈或什么?我試圖避免每年都創建一個中間臨時表。
最終輸出應該類似于這張表。如果有幫助,我可以將年份轉換為列。
uj5u.com熱心網友回復:
您可以使用遞回 cte根據前一行計算此值:
WITH recursive_cte AS
(
-- Anchor member
SELECT s.productid, s.year, s.growthrate from #sales s
UNION ALL
-- Recursive member that references expression_name.
SELECT
g.productid,
g.year,
r.growthrate * (1 g.growthrate) as growthrate
FROM #growthrates g
INNER JOIN recursive_cte r
ON r.productid = g.productid AND r.year = g.year - 1
)
-- references expression name
SELECT *
FROM recursive_cte
ORDER BY productid, year
輸出:
| 產品編號 | 年 | 增長率 |
|---|---|---|
| 1 | 2021年 | 1000 |
| 1 | 2022年 | 1020 |
| 1 | 2023 | 1060.8 |
| 1 | 2024 | 1092.624 |
| 1 | 2025 | 1147.2552 |
| 2 | 2021年 | 5000 |
| 2 | 2022年 | 5500 |
| 2 | 2023 | 6160 |
| 2 | 2024 | 6468 |
| 2 | 2025 | 7050.12 |
如果您不想要分數,請添加舍入函式。
見分貝<>撥弄用于上述動作中,以及這樣的例子同時使用round()。
uj5u.com熱心網友回復:
我在這里也添加了@lptr 的僅評論答案作為正確答案,因為它是一個不錯的選擇并導致相同的結果。
此解決方案通過使用對數和視窗函式來創建運行乘法產品:
select g.productid,
g.year,
floor(s.growthrate*exp(sum(log(1 g.growthrate)) over(partition by g.productid order by g.year)))
from #Sales as s
join #GrowthRates as g on s.productid = g.productid
and s.year < g.year
order by productid,year
有關@lptr 的原始解決方案,請參閱此 db<>fiddle。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391569.html
標籤:sql sql-server 循环
上一篇:在SQLServer中從XMLNodes中選擇是否算作3部分命名約定?
下一篇:將列值拆分為新行
