将多条交易记录转换为并发交易的汇总

问题描述 投票:0回答:1

我有一个包含许可证事务的 SQL Server 数据库。我知道许可证何时检出以及何时重新检入。

示例:

DAY     HourOut HourIn  Licenses
4/16/2024   2   5   124
4/16/2024   8   13  28
4/16/2024   9   10  28

我想知道的是,在某一时间有多少个许可证同时被签出。上面的数据告诉我:

  • 从 2 到 5 共有 124 个许可证被签出
  • 从 6-7 有 0
  • 从 8 点到 9 点有 28 点
  • 从9点到10点有56个
  • 从11到13有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 函数或标准来重组所示的数据。

sql sql-server
1个回答
0
投票

您可以使用

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 进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.