我需要將日期跨度分解為一年中的季度。我在主查詢中使用以下查詢,但由于在交叉應用陳述句中達到了最大值,我沒有從 select 陳述句中獲得最新季度的資料。如何在 select 陳述句的 Values 中動態增加數字。我想得到 2022Q2、2022Q3 和當前的 2022Q4,但查詢在 2022Q1 停止,因為 select 陳述句中的值最大為 12。
Select CAST(YEAR(DATEADD(QQ,n,'2019-01-01')) AS VARCHAR(4)) 'Q' DATENAME(qq,DATEADD(QQ,n,'3000-12-31')) as Year_Quarter
from(
SELECT TOP(1 DATEDIFF(QQ,'2019-01-01','2999-12-31')) n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) rc(n)) as x
order by 1
2019Q1
2019Q2
2019Q3
2019Q4
2020Q1
2020Q2
2020Q3
2020Q4
2021Q1
2021Q2
2021Q3
2021Q4
2022Q1
我嘗試將數字添加到值然后得到
Select CAST(YEAR(DATEADD(QQ,n,'2019-01-01')) AS VARCHAR(4)) 'Q' DATENAME(qq,DATEADD(QQ,n,'3000-12-31')) as Year_Quarter
from(
SELECT TOP(1 DATEDIFF(QQ,'2019-01-01','2999-12-31')) n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15)) rc(n)) as x
order by 1
我希望內部選擇中的值動態添加以獲取當前季度。
2019Q1
2019Q2
2019Q3
2019Q4
2020Q1
2020Q2
2020Q3
2020Q4
2021Q1
2021Q2
2021Q3
2021Q4
2022Q1
2022Q2
2022Q3
2022Q4
uj5u.com熱心網友回復:
正如我所提到的,使用 Tally。行內的看起來像這樣:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
UNION ALL
SELECT TOP (DATEDIFF(QUARTER,'20190101','29991231'))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4, N N5, N N6, N N7, N N8)
SELECT DATEADD(QUARTER,T.I, '20190101'),
CONCAT(YEAR(DATEADD(QUARTER,T.I, '20190101')),'Q',DATEPART(QUARTER,DATEADD(QUARTER,T.I, '20190101')))
FROM Tally T;
如果你想創建一個函式,那么你可以創建它并像這樣使用它:
CREATE OR ALTER FUNCTION [fn].[Tally] (@End bigint, @StartAtOne bit)
RETURNS table
AS RETURN
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
WHERE @StartAtOne = 0
UNION ALL
SELECT TOP (@End)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4, N N5, N N6, N N7, N N8)
SELECT I
FROM Tally;
GO
SELECT DATEADD(QUARTER,T.I, '20190101'),
CONCAT(YEAR(DATEADD(QUARTER,T.I, '20190101')),'Q',DATEPART(QUARTER,DATEADD(QUARTER,T.I, '20190101')))
FROM fn.Tally(DATEDIFF(QUARTER,'20190101','29991231'),0) T;
uj5u.com熱心網友回復:
您可以交叉連接兩個值表
這始終顯示最近的 16 個季度
SELECT CONVERT(varchar(4), (YEAR(GETDATE()) - j.n)) 'Q' CONVERT(varchar(1), q.n) as quarter
FROM
(VALUES (0), (1), (2), (3), (4)) AS j(n)
CROSS JOIN
(VALUES (1), (2), (3), (4)) AS q(n)
WHERE
(j.n > 0 OR q.n <= DATEPART(q, GETDATE())) AND
(j.n < 4 OR q.n > DATEPART(q, GETDATE()))
ORDER BY j.n DESC, q.n ASC
在這里j(n),我使用從當前年份中減去的年份偏移量,以使過去 4 年比當前年份高。
然后將計算的年份轉換為 varchar 并與'Q'季度連接。請注意,年份不是硬編碼的,因此查詢會動態回傳過去四年的所有季度。
2023 年 1 月 1 日創建的輸出:
2019Q2
2019Q3
2019Q4
2020Q1
2020Q2
2020Q3
2020Q4
2021Q1
2021Q2
2021Q3
2021Q4
2022Q1
2022Q2
2022Q3
2022Q4
2023Q1
uj5u.com熱心網友回復:
我認為您希望它從固定的開始日期變為動態的結束日期,僅此而已。此代碼通過獲取硬編碼的@StartDate 來作業,計算出上一季度末完成,然后使用遞回 CTE 迭代日期,每次添加 1 個季度,并進行一些字串操作以獲取正確的格式。一旦 GETDATE() 進入新的季度,CTE 將回傳第 17 個值,而無需更改代碼。
DECLARE @StartDate DATETIME = '2019-01-01';
DECLARE @LastQuarterEndDate DATETIME = DATEADD(D, -1, DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0));
WITH recCTE
AS (
SELECT ConCat(DATEPART(YYYY, @StartDate), 'Q', DATEPART(QQ, @StartDate)) AS DateQuarter, @StartDate AS Date
UNION ALL
SELECT CONCAT(DATEPART(YYYY, DATEADD(QQ, 1, recCTE.Date)), 'Q', DATEPART(QQ, DATEADD(QQ, 1, recCTE.Date))),
DATEADD(QQ, 1, recCTE.Date)
FROM recCTE
WHERE recCTE.Date < @LastQuarterEndDate
)
SELECT * FROM recCTE;
uj5u.com熱心網友回復:
另一種方法是通過復制季度數然后拆分來構建序列,根據 row_number 計算年份和季度數:
DECLARE @d date = GETDATE();
DECLARE @q int = DATEPART(QUARTER, @d),
@s date = '20190101';
SELECT d, q = CONCAT_WS('Q', YEAR(d), r IIF(r=0,4,0))
FROM (SELECT DATEADD(QUARTER, r-1, @s), r%4
FROM (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM STRING_SPLIT(REPLICATE(',',
(4*(YEAR(@d) - YEAR(@s))) @q-1),',')
) y(r)) z(d,r);
輸出:
| d | q |
|---|---|
| 2019-01-01 | 2019Q1 |
| 2019-04-01 | 2019Q2 |
| 2019-07-01 | 2019Q3 |
| 2019-10-01 | 2019年第四季度 |
| 2020-01-01 | 2020Q1 |
| 2020-04-01 | 2020Q2 |
| 2020-07-01 | 2020年第三季度 |
| 2020-10-01 | 2020年第四季度 |
| 2021-01-01 | 2021Q1 |
| 2021-04-01 | 2021Q2 |
| 2021-07-01 | 2021Q3 |
| 2021-10-01 | 2021Q4 |
| 2022-01-01 | 2022Q1 |
| 2022-04-01 | 2022Q2 |
| 2022-07-01 | 2022Q3 |
| 2022-10-01 | 2022Q4 |
這個小提琴中的作業示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/523915.html
標籤:sqlsql服务器
上一篇:SnowflakeSQL:為什么在多陳述句腳本中執行查詢時出現意外的“<EOF>”?
下一篇:查找每天發生的事件數-SQL
