2015-10-05 4 views
0

Я нашел похожие вопросы, но ничего, что имеет решение, я смог сделать для меня работу. Я был вне практики и застрял на этом.SQL Server: отображение нескольких строк в одной строке и нескольких столбцов

У меня есть таблица, которая отслеживает позиции сотрудников. Каждый сотрудник может иметь любое количество активных позиций. Я хочу показать каждого сотрудника как одну запись со всеми их позициями в этой записи, охватывающей несколько столбцов.

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

Все позиции имеют порядковый номер, но они не в удобном порядке - неактивные позиции для сотрудника сохраняют порядковый номер.

Так что сейчас у меня есть что-то, что выглядит следующим образом:

ID | Name | Title | Cat | Seq 
    ------------------------------ 
    10 | John | Asst. | HR | 13 
    10 | John | Tutor | EDU | 17 
    11 | Sue | Mgr | PA | 6 
    11 | Sue | Adj. | EDU | 7 
    11 | Sue | Tutor | EDU | 13 
    ... 
    11 | Sue | Asst. | HR | 22 

Но я хочу, чтобы выглядеть следующим образом:

ID | Name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3...| Title 6 | Cat 6 
    ---------------------------------------------------------------------------- 
    10 | John | Asst. | HR | Tutor | EDU | NULL  | NULL | NULL 
    11 | Sue | Mgr. | PA | Adj. | EDU | Tutor  | Asst. | HR 

Позвольте мне знать, какую дополнительную информацию я должен предоставить.

+2

Вы, вероятно, будет в конечном итоге в области 'PIVOT's, они могут быть немного трудно работать в контексте того, что вы пытаюсь сделать, особенно если вы попытаетесь создать динамическое число столбцов. Такой подход противоречит принципам РСУБД, поскольку вы денормализуете свои данные. – CactusCake

+0

Ух, я боялся, что поворот будет предложением. re: Denormalizing, это просто для одноразового дампа данных, поэтому в этом случае это не проблема. – Jana

+1

Если это некоторая вещь, я бы предложил добавить столбец «ROW_NUMBER() поверх (PARTITION BY ID ORDER BY Cat, Title)», то вы можете использовать его как индекс в Excel или какую-либо другую программу для переноса данных. – CactusCake

ответ

0

Для этого вы можете использовать комбинацию row_number и pivots. Используя SQL Server 2012+, запрос может выглядеть примерно так. Это немного беспорядочно, но он должен выполнить эту работу, хотя могут быть лучшие способы добиться того же результата.

select 
    id 
    , name 
    , max([Title 1]) as [Title 1] 
    , max([Cat 1]) as [Cat 1] 
    , max([Title 2]) as [Title 2] 
    , max([Cat 2]) as [Cat 2] 
    , max([Title 3]) as [Title 3] 
    , max([Cat 3]) as [Cat 3] 
    -- and so on for the remaining columns... 
from (
    select 
     id, name, title, cat 
     , t = concat('Title ',row_number() over (partition by id order by seq)) 
     , c = concat('Cat ',row_number() over (partition by id order by seq)) 
    from your_table 
    ) src 
pivot (max(title) for t in ([title 1],[title 2],[title 3]))pt 
pivot (max(cat) for c in ([cat 1],[cat 2],[cat 3]))pc 
group by id, name; 

Я только написал название/cat 1 - 3, чтобы сэкономить место, но вы должны получить эту идею. Результат

Sample SQL Fiddle

Пример:

| id | name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3 | Cat 3 | 
|----|------|---------|-------|---------|-------|---------|--------| 
| 10 | John | Asst. | HR | Tutor | EDU | (null) | (null) | 
| 11 | Sue | Mgr | PA | Adj. | EDU | Tutor | EDU | 
Смежные вопросы