2013-06-20 2 views
0

У меня есть таблица, которая выглядит примерно так.Использование SQL pivot в случае только одного дублированного поля данных

owner  owner_email  customer 
dude1  email1   customer1 
dude1  email1   customer2 
dude1  email1   customer3 
dude2  email2   customer4 
dude2  email2   customer5 

и т.д ...

Ищу следующего

owner  owner_email  customer1  customer2  customer3 etc 

Используя примеры Повороты на этом сайте, я начинаю видеть, что мне нужно что-то еще группе и у меня этого нет. Использует ли здесь правильное решение? У меня есть следующий пример использования другого.

SELECT * FROM 
(
SELECT [owner], [owner_email], [customer] 
FROM tTableName 
) AS source 
PIVOT 
(
    MAX([customer]) 
    FOR [customer] IN ([name1][name2][name3][name4][name5]) 
) as pvt 

Спасибо.

+0

SQL-запросы производят * исправленное * количество столбцов, чьи имена и типы данных также исправлены. Если вы хотите создать набор результатов с переменным числом столбцов, вы ** можете ** изучить динамический SQL, но обычно вам намного лучше выполнять такие преобразования на другом языке/ближе к пользователю. –

ответ

3

Для этого вы хотите посмотреть на добавление row_number() к вашему внутреннему запросу. Я использую row_number вместе с name создать столбцы name1, name2 и т.д. Тогда при применении функции PIVOT вы вернётесь клиента для каждого владельца в отдельных колонках:

SELECT * 
FROM 
(
    SELECT [owner], [owner_email], [customer], 
    'Name'+cast(row_number() over(partition by owner 
            order by customer) as varchar(50)) name 
    FROM tTableName 
) AS source 
PIVOT 
(
    MAX([customer]) 
    FOR [name] IN ([name1],[name2],[name3],[name4],[name5]) 
) as pvt; 

См SQL Fiddle with Demo.

Если вы собираетесь иметь более 5 имен для каждого владельца, то вы можете использовать динамический SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('Name'+cast(row_number() over(partition by owner 
               order by customer) as varchar(50))) 
        from tTableName 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [owner], [owner_email],' + @cols + ' 
      from 
      (
       SELECT [owner], [owner_email], [customer], 
       ''Name''+cast(row_number() over(partition by owner 
               order by customer) as varchar(50)) name 
       FROM tTableName 
      ) x 
      pivot 
      (
       max(customer) 
       for name in (' + @cols + ') 
      ) p ' 

execute(@query); 

См SQL Fiddle with Demo. Они создают результат:

| OWNER | OWNER_EMAIL |  NAME1 |  NAME2 |  NAME3 | NAME4 | NAME5 | 
----------------------------------------------------------------------------- 
| dude1 |  email1 | customer1 | customer2 | customer3 | (null) | (null) | 
| dude2 |  email2 | customer4 | customer5 | (null) | (null) | (null) | 
+1

+1, потому что это четверг – Kermit

+0

Спасибо bluefeet! Вот так! Также благодарим за ссылку на сайт скрипта SQL. Я буду использовать его в будущем. – joerdie