繁体   English   中英

计算和检索 SQL 数据、附加列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM