Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构建年度和季度组合表_Sql_Sql Server - Fatal编程技术网

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时,结果是错误的