2015-10-19 2 views
-1

У меня есть таблица сИстория вызовов В колонках SQL SERVER

select [Caller ID] , [Call details] from [DEMO].[dbo].[calldetails] 

enter image description here

хотите результаты в нескольких столбцах, как

enter image description here

+0

пожалуйста, проверьте ссылку на изображение, чтобы понять мое требование –

+0

Простой, как ** ОСИ ** – lad2025

ответ

0

Вы можете использовать оператор PIVOT таблицы, чтобы сделать это:

SELECT 
    [Caller ID], 
    [1] AS [Call Details 1], 
    [2] AS [Call Details 2], 
    [3] AS [Call Details 3] 
FROM 
(
    SELECT 
    [Caller ID], 
    [Call details], 
    ROW_NUMBER() OVER(PARTITION BY [Caller ID] 
         ORDER BY [Caller ID]) AS RN 
    FROM [calldetails] 
) AS t 
PIVOT 
(
    MAX([Call details]) 
    FOR RN IN([1], [2], [3]) 
) AS p; 

Обратите внимание, что:

  • Я использовал номер строки генерируется на основе Caller ID к группе деталей вызова в 3 колонки.
  • Я приказал результаты Caller ID, поскольку я должен использовать ORDER BY с PARTITION BY. Вот почему вы найдете результаты не в том же порядке, который вы ищете.

  • SQL Fiddle Demo

Это даст вам:

| Caller ID | Call Details 1 | Call Details 2 | Call Details 3 | 
|-----------|-----------------|-----------------|----------------| 
|  123 | Ordered Product | Shipped Product | More Details | 
|  125 | product search |   (null) |   (null) | 
|  234 | product search | Ordered Product |   (null) | 

Если вы хотите сделать это динамически и не перечислить этот список номера строки вручную, вы должны сделать это динамически следующим образом:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @colnames AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

SELECT @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(RN) 
         FROM 
       (
       SELECT ROW_NUMBER() OVER(PARTITION BY [Caller ID] 
              ORDER BY [Caller ID]) AS RN 
       FROM [Calldetails] 
       ) AS t 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @colnames = STUFF((SELECT distinct ',' + 
         QUOTENAME(RN) + 'AS' + 
         QUOTENAME('[Call details ' + CAST(RN AS NVARCHAR(5)) + ']') 
         FROM 
       (
       SELECT ROW_NUMBER() OVER(PARTITION BY [Caller ID] 
              ORDER BY [Caller ID]) AS RN 
       FROM [Calldetails] 
       ) AS t 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 'SELECT [Caller ID], ' + @colnames + 
        ' FROM 
        (
         SELECT 
         [Caller ID] , 
         [Call details], 
         ROW_NUMBER() OVER(PARTITION BY [Caller ID] 
              ORDER BY [Caller ID]) AS RN 
         FROM [calldetails] 
        ) AS t 
        PIVOT 
        (
         MAX([Call details]) 
         FOR RN IN(' + @cols + ')' + 
             ') p'; 

execute(@query); 
+0

Большое спасибо .. :) –

+0

@SaileshAgarwal - Добро пожаловать, пожалуйста, попробуйте принять ответьте, если вы сочтете это полезным. –

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