Pergunta

Tentando encontrar alguns exemplos simples do SQL Server PIVOT.A maioria dos exemplos que encontrei envolve contar ou somar números.Eu só quero dinamizar alguns dados de string.Por exemplo, tenho uma consulta que retorna 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 assim:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Isso é possível com a funcionalidade PIVOT?

Foi útil?

Solução

Lembre-se de que a função agregada MAX funcionará tanto com texto quanto com números.Esta consulta exigirá que a tabela seja verificada apenas 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

Outras dicas

Se você deseja usar especificamente a função SQL Server PIVOT, isso deve funcionar, assumindo que suas duas colunas originais sejam chamadas act e cmd.(Mas não é tão bonito de se ver.)

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

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 mesa:SELECT action, view_edit FROM dbo.tbl

Your table

Consultar sem usar 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 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:
enter image description here

De http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/:

SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO

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

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

Tive uma situação em que estava analisando strings e as duas primeiras posições da string em questão seriam os nomes dos campos de um padrão de codificação de reivindicações de saúde.Então, eu retiraria as strings e obteria valores para F4, UR e UQ ou algo assim.Isso foi ótimo em um registro ou em alguns registros para um usuário.Mas quando eu queria ver centenas de registros e os valores de 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 “cada vez que alguém enviava uma solicitação de Benadryl, qual valor ele enviava nos campos F4, UR e UQ.Eu tinha um OUTER APPLY que criava o ColTitle e os campos de valor abaixo

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

Você pode usar isso com dinamização:

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top