Сформировать три столбца таблицы из таблицы столбцов - PullRequest
4 голосов
/ 25 марта 2012

У меня вопрос новичка:

Мне нужно написать сценарий SQL, который возвращает набор результатов из 3 столбцов из данной таблицы из одного столбца @T с целочисленным полем N, например:

declare @t table(n int) 
insert into @t(n) values (3),(4),(5),
                         (6),(7),(8),
                         (9),(10),(11),
                         (13),(14),(15),
                         (16),(17),(18), (19)

Таблица результатов 3 столбца должна содержать данные из таблицы @T строка за строкой в ​​порядке возрастания.Если в таблице @T есть пропущенные значения (например, {2,4} 3 отсутствует), соответствующая ячейка в наборе результатов должна быть NULL.

Пример 1:
Для таблицы со значениями {2,3,4,5} таблица результатов должна выглядеть следующим образом:

NULL    2   3 
4    5  NULL 

Пример 2: Для таблицы со значениями {2,4} таблица результатов должна выглядетькак:

NULL    2   NULL 
4    NULL  NULL 

1 Ответ

8 голосов
/ 25 марта 2012

Вы можете использовать таблицу чисел следующим образом:

select T1.n, 
       T2.n, 
       T3.n 
from Numbers as N
  left outer join @T as T1
    on N.Number * 3 + 1 = T1.n
  left outer join @T as T2
    on N.Number * 3 + 2 = T2.n
  left outer join @T as T3
    on N.Number * 3 + 3 = T3.n
where N.Number between 0 and (select max(n) from @T) / 3

Рабочий образец, используя master..spt_values в качестве таблицы чисел.

declare @t table(n int) 
insert into @t(n) values (3),(4),(5),
                         (6),(7),(8),
                         (9),(10),(11),
                         (13),(14),(15),
                         (16),(17),(18), (19)


;with Numbers(Number) as
(
  select number
  from master..spt_values
  where type = 'P'
)

select T1.n, 
       T2.n, 
       T3.n 
from Numbers as N
  left outer join @T as T1
    on N.Number * 3 + 1 = T1.n
  left outer join @T as T2
    on N.Number * 3 + 2 = T2.n
  left outer join @T as T3
    on N.Number * 3 + 3 = T3.n
where N.Number between 0 and (select max(n) from @T) / 3

Или вы можете использовать таблицу чисел с опорой:

select [1], [2], [3]
from
  (
    select (N.Number - 1) / 3 as Number,
           T.n,
           1 + ((N.Number - 1) % 3) as rn
    from Numbers as N
      left outer join @T as T on
        N.Number = T.n
    where N.Number between 1 and (select max(n) from @T)
  ) as T
pivot
  (min(n) for rn in ([1], [2], [3])) as P
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...