[英]Calculate and retrieve SQL data, additional columns
我有一个有 3 列的小桌子
Title | StartMonth | EndMonth
它有以下数据
ESX Upgrades 6.7 8 10
Fix SQL 9 11
Universe Red Hat Migration 7 12
Upgrade Aventail device 9 9
Learn coding 11 12
我希望能够运行查询/计算来检索可以在类似于下面的日历样式输出中显示的数据
ESX Host Upgrades 6.7 August September October
Fix SQL September October November
Universe Red Hat Migration July August September October November December
Upgrade Aventail device September
Lean coding November December
任何想法/信息将不胜感激
我相信可以使用 CASE 功能将数字投影到月份,但需要弄清楚如何在开始和结束月份之间获得月份。
您可以拥有一个包含月份编号和月份名称映射的表,然后使用 CROSS APPLY 获取相应的月份名称,然后将它们与标题进行聚合。
DECLARE @t table(Title varchar(500), StartMonth int, EndMonth int)
INSERT INTO @t
values
('ESX Upgrades 6.7' ,8 ,10),
('Fix SQL' ,9 ,11),
('Universe Red Hat Migration' ,7 ,12),
('Upgrade Aventail device' ,9 ,9 ),
('Learn coding' ,11 ,12);
SELECT * FROM @t
;WITH CTE_NumberMonth as
(
SELECT *
FROM
(
VALUES
(1,'January')
,(2,'February')
,(3,'March')
,(4,'April')
,(5,'May')
,(6,'June')
,(7,'July')
,(8,'August')
,(9,'September')
,(10,'October')
,(11,'November')
,(12,'December')
) AS t(Num,MName)
)
SELECT Title , STRING_AGG(it.mName,' ') AS Months
FROM @t as ot
CROSS APPLY (
SELECT MName from CTE_NumberMonth
where Num between ot.StartMonth and ot.EndMonth) as it
GROUP BY Title
+----------------------------+-------------------------------------------------+
| Title | Months |
+----------------------------+-------------------------------------------------+
| ESX Upgrades 6.7 | August September October |
| Fix SQL | September October November |
| Learn coding | November December |
| Universe Red Hat Migration | July August September October November December |
| Upgrade Aventail device | September |
+----------------------------+-------------------------------------------------+
您可以为此使用递归 CTE:
with cte as (
select str, lo + 1 as lo,
convert(varchar(max), datename(month, dateadd(month, lo - 1, '2000-01-01'))) as months, hi, 1 as lev
from t
union all
select str, lo + 1 as lo,
convert(varchar(max), months + ' ' + datename(month, dateadd(month, lo - 1, '2000-01-01'))) as months, hi, lev + 1
from cte
where lo <= hi
)
select *
from cte
where lo = hi + 1;
这是一个 db<>fiddle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.