2015-07-06 2 views
1

У меня есть таблица, которая выглядит следующим образом:Сплит строки с одинаковым идентификатором в столбцах

ID Name 
1  John 
1  Maria 
1  Sam 
2  Lisa 
2  Martin 

Я хотел бы иметь выход так:

ID NAME1 NAME2 NAME3 
1  John  Maria Sam 
2  Lisa  Martin NULL 

Я не хочу использовать функция pivot, потому что она не даст мне этот результат (когда попробовал это).

ID будет генерировать только 3 строки с одинаковыми id nr, так что там всего 3 столбца имен.

Отделочные SP для этого запроса:

INSERT INTO [Database].[dbo].[TEST] 
(
     [ID], 
     [Contact1], 
     [Contact2], 
     [Contact3] 
) 

;WITH CTE 
AS 
(
SELECT 
    ID, 
    NAMN, 
    ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum 
FROM tabl1 
WHERE VISA_EJ = 0 
) 
SELECT 
    [ID], 
    [1] AS [Contact1], 
    [2] AS [Contact2], 
    [3] AS [Contact3] 
FROM CTE 
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts] 

Все еще получаю сообщение об ошибке с точкой с запятой.

+1

Всегда 3 столбца, или может быть больше - например, 10, 100, 1000 ...? –

ответ

1

Вы можете использовать сочетание оконной функции и поворота:

;with cte as(select id, 
        name, 
        row_number() over(partition by id order by name) as rn 
      from table_name) 
select id, 
     [1] as name1, 
     [2] as name2, 
     [3] as name3 
from cte 
pivot(max(name) for rn in([1],[2],[3]))p 

В качестве альтернативы вы можете сделать то же самое с подзапроса:

select id, 
     [1] as name1, 
     [2] as name2, 
     [3] as name3 
from (select id, 
       name, 
       row_number() over(partition by id order by name) as rn 
     from table_name) cte 
pivot(max(name) for rn in([1],[2],[3]))p 

EDIT:

;WITH CTE 
AS 
(
SELECT 
    ID, 
    NAMN, 
    ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum 
FROM tabl1 
WHERE VISA_EJ = 0 
) 

INSERT INTO [Database].[dbo].[TEST] 
(
     [ID], 
     [Contact1], 
     [Contact2], 
     [Contact3] 
) 

SELECT 
    [ID], 
    [1] AS [Contact1], 
    [2] AS [Contact2], 
    [3] AS [Contact3] 
FROM CTE 
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts] 
+0

Эта работа благодарит вас. – Nils

+1

Немного опечатки: в вашем ците отсутствует часть 'FROM tbl'. ;-) – cars10m

+0

im пытается использовать это в хранимой процедуре, но я получаю эту ошибку: «Неправильный синтаксис рядом с ключевым словом« с ». Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен быть прерван точкой с запятой ». если я поставил ";" перед С С то я все еще получаю сообщение об ошибке. Я использую sql server 2012 r2 – Nils

1

Это один делает работа теперь:

WITH ot AS (
SELECT ID, Name, 
    ROW_NUMBER() OVER (Partition BY ID ORDER BY Name) n 
FROM tbl) 
SELECT a.id id, a.Name name1,b.Name name2, c.Name name3 
FROM ot a 
LEFT JOIN ot b ON b.id=a.id AND b.n=2 
LEFT JOIN ot c ON c.id=b.id AND c.n=3 
WHERE a.n=1 
ORDER BY id 

Смотрите здесь: http://sqlfiddle.com/#!6/2f850/1

Это покажет столбцы name2 и name3 только если они существуют.

+0

Просто спасибо. – Nils

+0

не совсем верно, хотя: -/см. Здесь: http://sqlfiddle.com/#!6/34dee/1 ... – cars10m

+0

Я должен был быстро, но спасибо. – Nils

Смежные вопросы