我在資料庫表中有以下表結構和資料:
| ID | 年 | 開始周 | 周末 | 分配百分比 |
|---|---|---|---|---|
| 5 | 2021年 | 34 | 35 | 50 |
| 6 | 2021年 | 1 | 3 | 5 |
我需要將多周行拆分為多個單周行,最終結果應該是:
| ID | 年 | 開始周 | 周末 | 分配百分比 |
|---|---|---|---|---|
| 5 | 2021年 | 34 | 34 | 50 |
| 5 | 2021年 | 35 | 35 | 50 |
| 6 | 2021年 | 1 | 1 | 5 |
| 6 | 2021年 | 2 | 2 | 5 |
| 6 | 2021年 | 3 | 3 | 5 |
對此的任何幫助將不勝感激!有很多關于將日期范圍拆分為多行的主題,但我似乎無法修改它們以適合我的用例。我知道我很可能需要一個帶有周數的計數表(我已經有了)。
uj5u.com熱心網友回復:
另一種思考方式是,因為我們知道最大周數是 53,所以要生成所有可能周數的集合,然后在該范圍內的任何源行中每周外連接到該集合。
;WITH n(n) AS
(
SELECT 0 UNION ALL SELECT n 1 FROM n WHERE n <= 53
)
SELECT w.ID,
w.Year,
StartWeek = n.n,
EndWeek = n.n,
w.AllocationPercent
FROM n
INNER JOIN dbo.TableName AS w
ON n.n BETWEEN w.StartWeek AND w.EndWeek
ORDER BY w.ID, w.Year, n.n;
結果:
| ID | 年 | 開始周 | 周末 | 分配百分比 |
|---|---|---|---|---|
| 5 | 2021年 | 34 | 34 | 50 |
| 5 | 2021年 | 35 | 35 | 50 |
| 6 | 2021年 | 1 | 1 | 5 |
| 6 | 2021年 | 2 | 2 | 5 |
| 6 | 2021年 | 3 | 3 | 5 |
- 示例資料庫<>小提琴
uj5u.com熱心網友回復:
您可以使用遞回cte:
;with cte as (
select t.id, t.year, t.startweek, t.endweek, t.AllocationPercent
from t
union all
select id, year, startweek 1, endweek, AllocationPercent
from cte c
where startweek < endweek
)
select id, year, startweek, startweek as endweek, AllocationPercent
from cte
order by id, startweek, endweek;
資料庫小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313290.html
標籤:sql sql-server 查询语句
