Sql 构建年度和季度组合表
假设我有一年和一个季度,我想建立一个表格,列出以给定的年和季度结束的特定数量的年和季度组合Sql 构建年度和季度组合表,sql,sql-server,Sql,Sql Server,假设我有一年和一个季度,我想建立一个表格,列出以给定的年和季度结束的特定数量的年和季度组合 DECLARE @Quarter INT = 3; DECLARE @Year INT = 2018; DECLARE @NumRows INT = 4; DECLARE @initial_date DATETIME = DATEADD(quarter, @Quarter-1, DATEADD(year, @Year-1900, 0)); 例如 您可以使用递归生成 首先,需要根据年份和季度构建DATE
DECLARE @Quarter INT = 3;
DECLARE @Year INT = 2018;
DECLARE @NumRows INT = 4;
DECLARE @initial_date DATETIME = DATEADD(quarter, @Quarter-1, DATEADD(year, @Year-1900, 0));
例如
您可以使用递归生成 首先,需要根据年份和季度构建DATETIME对象
DECLARE @Quarter INT = 3;
DECLARE @Year INT = 2018;
DECLARE @NumRows INT = 4;
DECLARE @initial_date DATETIME = DATEADD(quarter, @Quarter-1, DATEADD(year, @Year-1900, 0));
然后您可以递归地生成像这样的年度和季度组合
;WITH quarters AS (
SELECT @initial_date AS [qdate]
UNION ALL
SELECT DATEADD(quarter, -1, [qdate]) AS [qdate]
FROM quarters
WHERE [qdate] > DATEADD(quarter, -1*(@NumRows-1), @initial_date)
)
SELECT DATEPART(year, qdate) as year, DATEPART(quarter, qdate) as quarter FROM quarters
您可以使用递归生成 首先,需要根据年份和季度构建DATETIME对象
DECLARE @Quarter INT = 3;
DECLARE @Year INT = 2018;
DECLARE @NumRows INT = 4;
DECLARE @initial_date DATETIME = DATEADD(quarter, @Quarter-1, DATEADD(year, @Year-1900, 0));
然后您可以递归地生成像这样的年度和季度组合
;WITH quarters AS (
SELECT @initial_date AS [qdate]
UNION ALL
SELECT DATEADD(quarter, -1, [qdate]) AS [qdate]
FROM quarters
WHERE [qdate] > DATEADD(quarter, -1*(@NumRows-1), @initial_date)
)
SELECT DATEPART(year, qdate) as year, DATEPART(quarter, qdate) as quarter FROM quarters
您可以尝试使用cte recursive进行一些计算
DECLARE @Year INT= 2018
DECLARE @Quarter INT = 3
DECLARE @NumRows INT= 10
;WITH CTE AS (
SELECT (@Year - @NumRows/4) yr,
4 - (@NumRows % 4) Quarter,
@NumRows NumRows
UNION ALL
SELECT yr + Quarter / 4,
CASE WHEN (Quarter + 1) % 4 = 0 THEN 4
ELSE (Quarter + 1) % 4
END,
NumRows- 1
FROM CTE
WHERE NumRows > 1
)
select yr,Quarter
from cte
您可以尝试使用cte recursive进行一些计算
DECLARE @Year INT= 2018
DECLARE @Quarter INT = 3
DECLARE @NumRows INT= 10
;WITH CTE AS (
SELECT (@Year - @NumRows/4) yr,
4 - (@NumRows % 4) Quarter,
@NumRows NumRows
UNION ALL
SELECT yr + Quarter / 4,
CASE WHEN (Quarter + 1) % 4 = 0 THEN 4
ELSE (Quarter + 1) % 4
END,
NumRows- 1
FROM CTE
WHERE NumRows > 1
)
select yr,Quarter
from cte
这使用递归cte 为了
这使用递归cte 为了 当@NumRows大于4时,结果是错误的当@NumRows大于4时,结果是错误的