我有一个 SQL 视图:
DECLARE @StartDate date = '5/1/2024'
DECLARE @EndDate date = '5/31/2024'
SELECT DISTINCT
i.IncidentNumber
, i.ReportNumber
FROM MV_Incident AS i WITH (nolock)
WHERE i.IncidentDate BETWEEN @StartDate AND dateadd(d, 1, @EndDate)
order by i.IncidentNumber
...返回这样的数据:
但我希望每一行都有一个唯一的第一列值,并且第二列中的任何多个值都显示在第三列中(或者第四列或第五列,如果有那么多)。
现在,如果我使用子查询,我就可以让它工作:
SELECT DISTINCT
i.IncidentNumber
, (SELECT i2.ReportNumber FROM MV_Incident AS i2 WITH (nolock) WHERE i2.IncidentNumber = i.IncidentNumber
ORDER BY i2.ReportNumber offset 0 rows FETCH next 1 row ONLY) AS ReportNumber1
, (SELECT i2.ReportNumber FROM MV_Incident AS i2 WITH (nolock) WHERE i2.IncidentNumber = i.IncidentNumber
ORDER BY i2.ReportNumber offset 1 rows FETCH next 1 row ONLY) AS ReportNumber2
...但是运行速度非常慢。有更好的方法可以实现这一点吗?
非常感谢任何可以提供帮助的人。
SQL 语言有一个严格的规则:在查看任何数据之前,您必须在查询编译时知道结果集中的列数。当您可以拥有这样的动态列时,它就违反了该规则。您有两种选择来解决它:
这两个选项都写起来很痛苦并且执行速度很慢,因为这个要求违反了支撑所有 SQL 数据库的关系集合理论。考虑到这一点,在客户端代码或报告工具中进行此转换通常会获得更好的结果。