У меня есть таблица, содержащая информацию, которая произошла за определенный день (1 день в строке). для каждой строки событие может происходить несколько раз.
| 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 события, но оно может go до 20, и есть несколько других столбцов, например, DateTime_X
, EmpName
, et c.
Я хочу создать запрос, который будет «сводить» эти данные, чтобы вместо этого я мог видеть по одной строке на событие, даже если идентификаторы дублированы. Пример:
| Id | Sector | WastedTime | FixingTime |
|----|--------|------------|------------|
| 1 | A | 15 | 30 |
| 1 | B | 30 | 60 |
| 2 | B | 60 | 120 |
| 2 | B | 120 | 240 |
Я пытался сделать это с разворотом, но безуспешно. Во время исследования я увидел команду CROSS APPLY
, попробовал ее, и она сработала.
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)
У меня вопрос , почему работает? Я немного прочитал эту команду и до сих пор не понимаю, почему она работает. Кроме того, CROSS APPLY
является ли путь к go для этой операции или что-то еще?