2008-08-23 3 views
119

Попытка найти несколько простых примеров SQL Server PIVOT. Большинство примеров, которые я нашел, включают подсчет или суммирование чисел. Я просто хочу повернуть некоторые строковые данные. Например, у меня есть запрос, возвращающий следующее.SQL Server: примеры данных PIVOTing String

Action1 VIEW 
Action1 EDIT 
Action2 VIEW 
Action3 VIEW 
Action3 EDIT 

Я хотел бы использовать PIVOT (если вообще возможно), чтобы сделать результаты так:

Action1 VIEW EDIT 
Action2 VIEW NULL 
Action3 VIEW EDIT 

Это возможно даже с функциональностью PIVOT?

+0

Взгляните на эту ссылку: http://dotnetgalactics.wordpress.com/2009/10/23/using-sql-server-20052008-pivot-on-unknown-number-of-columns-dynamic- pivot/Может быть полезно;) – Pato 2009-10-26 13:35:15

+0

Вы можете увидеть эту ссылку, если количество отдельных элементов неизвестно, а это означает, что столбцы после поворота не являются динамическими. [SQL Server Pivot: преобразование строк в столбцы с динамическим запросом] (http://blog.programmingsolution.net/sql-server-2008/sql-server-pivot-converting-rows-to-columns-with-dynamic-query/) – maeenul 2011-10-05 01:08:40

+1

Отметьте [Row To Column (PIVOT)] (http://wiki.lessthandot.com/index.php/Row_To_Column_%28PIVOT%29) и [Column To Row (UNPIVOT)] (http: //wiki.lessthandot .com/index.php/Column_To_Row_% 28UNPIVOT% 29) – SQLMenace 2008-09-02 19:56:58

ответ

164

Помните, что функция агрегации MAX будет работать как с текстом, так и с числами. В этом запросе потребуется только один раз сканировать таблицу.

SELECT Action, 
     MAX(CASE data WHEN 'View' THEN data ELSE '' END) ViewCol, 
     MAX(CASE data WHEN 'Edit' THEN data ELSE '' END) EditCol 
FROM t 
GROUP BY Action 
+9

Удивительный ответ. Сэкономил мне массу времени и разочарования. Хотел бы я дать вам больше, чем один голос! – 2009-02-04 16:11:24

+0

Что представляют данные? – adhanlon 2010-02-17 19:42:48

6

Ну, для вашего образца и любого с ограниченным количеством уникальных столбцов это должно сделать это.

select 
    distinct a, 
    (select distinct t2.b from t t2 where t1.a=t2.a and t2.b='VIEW'), 
    (select distinct t2.b from t t2 where t1.a=t2.a and t2.b='EDIT') 
from t t1 
52

Если вы специально хотите использовать функцию PIVOT SQL Server, то это должно работать, если ваши две оригинальные колонки называются акт и CMD. (Не то, чтобы очень, чтобы смотреть на все же.)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit' 
FROM (
    SELECT act, cmd FROM data 
) AS src 
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit]) 
) AS pvt 
50

настройки таблицы:

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL, 
    view_edit VARCHAR(20) NOT NULL 
); 

INSERT INTO dbo.tbl (action, view_edit) 
VALUES ('Action1', 'VIEW'), 
     ('Action1', 'EDIT'), 
     ('Action2', 'VIEW'), 
     ('Action3', 'VIEW'), 
     ('Action3', 'EDIT'); 

Ваш стол: SELECT action, view_edit FROM dbo.tbl

Your table

запросов без использования PIVOT:

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'), 
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT') 
FROM tbl t 
GROUP BY Action 

запросов с помощью PIVOT:

SELECT [Action], [View], [Edit] FROM 
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit])) AS t2 

Оба запроса результат:
enter image description here

5
With pivot_data as 
(
select 
action, -- grouping column 
view_edit -- spreading column 
from tbl 
) 
select action, [view], [edit] 
from pivot_data 
pivot (max(view_edit) for view_edit in ([view], [edit])) as p;