Sql server 有关交叉申请的澄清
我有一个表,其中包含给定日期内发生的信息,每行1天。 对于每一行,一个事件可能发生多次Sql server 有关交叉申请的澄清,sql-server,performance,Sql Server,Performance,我有一个表,其中包含给定日期内发生的信息,每行1天。 对于每一行,一个事件可能发生多次 | Id | Sector_1 | Sector_2 | WastedTime_1 | WastedTime_2 | FixingTime_1 | FixingTime_2 | |----|----------|----------|--------------|--------------|--------------|--------------| | 1 | A | B |
| Id | Sector_1 | Sector_2 | WastedTime_1 | WastedTime_2 | FixingTime_1 | FixingTime_2 |
|----|----------|----------|--------------|--------------|--------------|--------------|
| 1 | A | B | 15 | 30 | 30 | 60 |
| 2 | B | C | 60 | 120 | 120 | 240 |
请注意,我在这里显示了最多2个事件,但最多可以达到20个,并且还有多个其他列,例如DateTime_X、EmpName等
我想创建一个查询来透视数据,这样我就可以在每个事件中看到一行,即使ID是重复的。例:
| Id | Sector | WastedTime | FixingTime |
|----|--------|------------|------------|
| 1 | A | 15 | 30 |
| 1 | B | 30 | 60 |
| 2 | B | 60 | 120 |
| 2 | B | 120 | 240 |
我试图用支点来做,但没有成功。在我的研究过程中,我看到了交叉应用命令,并尝试了它,它成功了
SELECT Id,
StopEvent.*
FROM #events
CROSS APPLY
(
VALUES (Sector_1, WastedTime_1, FixingTime_1),
(Sector_2, WastedTime_2, FixingTime_2)
) AS StopEvent(Sector, WastedTime, FixingTime)
我的问题是为什么它会起作用?我读了一些关于这个命令的文章,但我仍然不明白它为什么会起作用。另外,交叉应用是执行此操作还是执行其他操作?作为替代方法,您可以使用UNION:
您当前使用APPLY的方法可能优于union方法。Paul White有几篇优秀的文章详细介绍了APPLY。我没有遇到,我会看一看谢谢!
SELECT Id, Sector_1 AS Sector, WastedTime_1 AS Wasted_Time, FixingTime_1 AS FixingTime FROM #events
UNION ALL
SELECT Id, Sector_2, WastedTime_2, FixingTime_2 FROM #events
ORDER BY Id, Sector;