我已經整理了一個代碼,用于檢查字串是否以 Q1、Q2、Q3 或 Q4 開頭,如果找到它應該顯示該季度的開始。
CREATE TABLE #Test (
name VARCHAR (20) NOT NULL,
);
INSERT INTO #Test
(name)
VALUES
('Q324'),
('Q224')
SELECT
name
,[Year] = '20' RIGHT(name,2)
,[Quarter] = CASE
WHEN LEFT(name,2) = 'Q1' THEN '01'
WHEN LEFT(name,2) = 'Q2' THEN '04'
WHEN LEFT(name,2) = 'Q3' THEN '07'
WHEN LEFT(name,2) = 'Q4' THEN '10'
ELSE NULL
END
from #Test
輸出表:

我現在如何顯示這些季度內的所有月份?
預期輸出:
Name Year Quarter MonthYear
Q324 2024 03 Jul-24
Q324 2024 03 Aug-24
Q324 2024 03 Sep-24
uj5u.com熱心網友回復:
一種方法是使用VALUES表構造將 0-2 個月添加到日期,然后將其格式化為您想要的值:
WITH CTE AS(
SELECT name
,[Year] = '20' RIGHT(name,2)
,[Quarter] = CASE
WHEN LEFT(name,2) = 'Q1' THEN '01'
WHEN LEFT(name,2) = 'Q2' THEN '04'
WHEN LEFT(name,2) = 'Q3' THEN '07'
WHEN LEFT(name,2) = 'Q4' THEN '10'
ELSE NULL
END
from #Test)
SELECT C.[Name],
C.[Year],
C.[Quarter],
CONCAT(LEFT(DATENAME(MONTH,DATEFROMPARTS(C.[Year], C.[Quarter] V.I,1)),3),'-',Year) AS MonthYear
FROM CTE C
CROSS APPLY (VALUES(0),(1),(2))V(I)
ORDER BY C.Year,
C.Quarter,
V.I;
請注意,這很可能會更簡潔,但我合并了您現有的代碼,而不是完全重寫它。
uj5u.com熱心網友回復:
您可以將其與要添加的行內數字虛擬表結合使用
SELECT
name,
v1.Year,
[Quarter] = FORMAT(v1.Month, '00'),
MonthYear = FORMAT(DATEFROMPARTS(v1.Year, v1.Month v2.MonthsToAdd, 1), 'MMM-yy')
from #Test t
CROSS APPLY (VALUES(
'20' RIGHT(name,2),
CASE LEFT(name,2)
WHEN 'Q1' THEN 1
WHEN 'Q2' THEN 4
WHEN 'Q3' THEN 7
WHEN 'Q4' THEN 10
END
)) v1(Year, Month)
CROSS APPLY (VALUES
(0),(1),(2)
) v2(MonthsToAdd);
資料庫<>小提琴
注意CROSS APPLY可以訪問計算值的使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341117.html
標籤:sql-server 查询语句
