sql-server - w3schools - using pivot in sql server




SQL Server: exemplos de dados de seqüência de caracteres PIVOTING (6)

Tentando encontrar alguns exemplos simples do SQL Server PIVOT. A maioria dos exemplos que encontrei envolve a contagem ou soma de números. Eu só quero girar alguns dados de string. Por exemplo, tenho uma consulta retornando o seguinte.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Eu gostaria de usar o PIVOT (se possível) para fazer os resultados da seguinte forma:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Isso é possível com a funcionalidade PIVOT?


Bem, para sua amostra e qualquer com um número limitado de colunas exclusivas, isso deve ser feito.

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

Configuração da tabela:

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');

Sua tabela: SELECT action, view_edit FROM dbo.tbl


Consulta sem usar o 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

Consulta usando o 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

Ambas as consultas resultam:


Eu tive uma situação em que estava analisando strings e as duas primeiras posições da string em questão seriam os nomes de campo de um padrão de codificação de declarações de assistência médica. Então, eu removia as strings e obtinha valores para F4, UR e UQ ou outros. Isso foi ótimo em um registro ou alguns registros para um usuário. Mas quando eu queria ver centenas de registros e os valores para todos os usuários, precisava ser um PIVOT. Isso foi maravilhoso, especialmente para exportar muitos registros para o Excel. A solicitação de relatório específica que recebi foi "toda vez que alguém enviou uma solicitação para o Benadryl, que valor eles enviaram nos campos F4, UR e UQ. Tive um EXTERIOR APLICADO que criou o ColTitle e os campos de valor abaixo

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )

Lembre-se de que a função agregada MAX funcionará no texto e também nos números. Esta consulta só exigirá que a tabela seja digitalizada uma vez.

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

Você pode usar isso com pivoting:

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;

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;




pivot