Вопрос SQL: Как мне перенести несколько результатов в одну строку? - PullRequest
0 голосов
/ 02 ноября 2009

У меня есть таблица в базе данных с названием «задержка поезда», с колонками

train number(int),
DelayTime(int),
DelayReason(nchar)

, поэтому поезд может иметь более одного времени задержки для каждой причины задержки, например:

trainnumber,Delaytime,DelayReason
1          ,5 sec    ,x
1          ,10 sec    ,Z
1          ,70 sec    ,TY

Я хочу создать отчет Crystal со следующим дизайном:

trainnumber, delaytime 1,delay reason 1 ,delaytime 2, delay reason 2,delaytime 3,delay reason 3

Но я не знаю запроса, который даст мне этот результат.

Я пробовал это:

select delaytime from dbo.traindelay

Но вывод выглядит так:

Delaytime
5
10
70

И я не хочу этого. Я хочу что-то вроде этого:

delaytime1 ,delaytime2 ,delaytime3 

1 Ответ

0 голосов
/ 02 ноября 2009

Сначала я предложу новую структуру, добавив столбец с именем Id, так что теперь у вас есть 2 таблицы:

  • Train (int Id, строка name)
  • TrainDelay (int Id, int TrainId, int DelayTime, nchar DelayReason

В SQL-запросе максимум 3 задержки на поезд:

select 
  t.Name, 
  d1.DelayTime   as Delay1, 
  d1.DelayReason as Reason1,
  d2.DelayTime   as Delay2, 
  d2.DelayReason as Reason2,
  d3.DelayTime   as Delay3, 
  d3.DelayReason as Reason3,
from Train as t
left join TrainDelay as d1 on d1.TrainId = t.Id 
left join TrainDelay as d2 on d2.TrainId = t.Id and d2.Id > d1.Id
left join TrainDelay as d3 on d3.TrainId = t.Id and d3.Id > d2.Id

Обратите внимание, что если у вас более 3 задержек для одного и того же поезда, у вас будет несколько результатов на поезд с дублированными записями. Вы можете добавить больше объединений, но это будет очень медленно, если ваш стол большой.

...