我有一个包含许可证事务的 SQL Server 数据库。我知道许可证何时检出以及何时重新检入。
示例:
DAY HourOut HourIn Licenses
4/16/2024 2 5 124
4/16/2024 8 13 28
4/16/2024 9 10 28
我想知道的是,在某一时间有多少个许可证同时被签出。上面的数据告诉我:
如何将上面的 4 列变成如下所示的 3 列报告?
示例:
DAY HOUR LICENSES
4/16/2024 2 124
4/16/2024 3 124
4/16/2024 4 124
4/16/2024 5 124
4/16/2024 8 28
4/16/2024 9 56
4/16/2024 10 56
4/16/2024 11 28
4/16/2024 12 28
4/16/2024 13 28
我正在努力思考使用哪些 SQL 函数或标准来重组所示的数据。
您可以使用
GENERATE_SERIES()
中的 CROSS APPLY
函数将 HourOut
/HourIn
范围扩展为一系列值(小时)。从那里,您只需按天和小时进行分组并对许可证进行求和即可。
SELECT D.Day, H.value AS Hour, SUM(D.Licenses) AS Licenses
FROM Data D
CROSS APPLY GENERATE_SERIES(D.HourOut, D.HourIn) H
GROUP BY D.Day, H.value
ORDER BY D.Day, H.value
GENERATE_SERIES()
仅在 SQL Server 2022 及更高版本中可用。
请参阅 this db<>fiddle 进行演示。