【发布时间】:2021-09-02 11:09:52
【问题描述】:
我使用以下查询根据名为“InsertDate”的表字段生成行:
;WITH listOfMonth(MonthNumber,ContractId )
AS
(
select
DATEPART(month, StartDate) as m,Id as ContractId from tblContract where Id = 6674
union all
select MonthNumber + 1 as MonthNumber ,ContractId
from listOfMonth
where MonthNumber < DATEPART(month, GETDATE())
)
select * from listOfMonth
例如,如果 InsertDate 是 2021 年 4 月 19 日,我有以下输出:
| ID | MonthNumber | ContractId |
|---|---|---|
| 1 | 4 | 6674 |
| 2 | 5 | 6674 |
| 3 | 6 | 6674 |
| 4 | 7 | 6674 |
| 5 | 8 | 6674 |
| 6 | 9 | 6674 |
但我还需要根据年份生成行,所以我更改了查询:
;WITH listOfMonth(YearNumber,MonthNumber,ContracId)
AS
(
select
DATEPART(Year, StartDate) as YearNumber,DATEPART(month, StartDate) as m,Id as ContracId from tblContract where Id = 6674
union all
select YearNumber, MonthNumber + 1 as MonthNumber ,ContracId
from listOfMonth
where MonthNumber < DATEPART(month, GETDATE())
)
select * from listOfMonth
此查询生成年份列,但仅针对 InsertDate 的当前年份, 例如,如果 InsertDate 是 4/19/2020 ,它只生成 2020 年的列,但我想生成 2020 年和 2021 年的列 我使用 SQL Server 2008 R2 最终输出应该是这样的:
| ID | MonthNumber | ContractId | YearNumber |
|---|---|---|---|
| 1 | 4 | 6674 | 2020 |
| 2 | 5 | 6674 | 2020 |
| 3 | 6 | 6674 | 2020 |
| 4 | 7 | 6674 | 2020 |
| 5 | 8 | 6674 | 2020 |
| 6 | 9 | 6674 | 2020 |
| 7 | 10 | 6674 | 2020 |
| 8 | 11 | 6674 | 2020 |
| 9 | 12 | 6674 | 2020 |
| 10 | 1 | 6674 | 2021 |
| 11 | 2 | 6674 | 2021 |
| 12 | 3 | 6674 | 2021 |
| 13 | 4 | 6674 | 2021 |
| 14 | 5 | 6674 | 2021 |
| 15 | 6 | 6674 | 2021 |
| 16 | 7 | 6674 | 2021 |
| 16 | 8 | 6674 | 2021 |
| 16 | 9 | 6674 | 2021 |
【问题讨论】:
-
这也将持续到“13”月;您每次只是在月份数字上加 +1,而不是实际加一个月。
-
有意义的样本数据和预期结果将帮助我们在这里为您提供帮助。
-
@DaleK 我放的是代码,而不是它的图像;你看到的图像是结果!
-
@DaleK 好的,很抱歉,但它的格式不正确
-
@DaleK 你能在 SO 中向我展示另一个将表格数据显示为文本的问题吗?
标签: sql sql-server tsql datetime common-table-expression