SQL Server: exemplos de dados de seqüência de caracteres PIVOTing

124

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, eu tenho uma consulta retornando o seguinte.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Gostaria de usar o PIVOT (se possível) para obter os resultados da seguinte forma:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Isso é possível com a funcionalidade PIVOT?

Tim Cochran
fonte
Dê uma olhada neste link: dotnetgalactics.wordpress.com/2009/10/23/… Pode ser útil;) #
Pato
Você pode ver este link se o número de itens distintos for desconhecido, o que significa que nenhuma coluna após a dinâmica é dinâmica. SQL Server Pivot: Converter linhas em colunas com Consulta dinâmica
maeenul

Respostas:

164

Lembre-se de que a função agregada MAX funcionará tanto em texto quanto em números. Essa consulta exigirá que a tabela seja varrida 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
John Hubert
fonte
+1 Cara ... você é seriamente um gênio. Eu gostaria de ter sabido disso antes, em vez de ter que aprender a PIVOTAR!
ashes999
@ Silmaril89 assumir que o nome da coluna 2º em questão é 'dados' e 1ª coluna é 'ação'
Iman
1
Existe alguma razão para eu não usar em ...ELSE NULL END...vez de ...ELSE '' END...?
mo.
15
O que é mais rápido, este ou PIVOT?
Robert Jeppesen
Whoah, você acabou de explodir minha mente. Na parte de trás da minha cabeça, eu tinha uma idéia do que eu considerava o SQL Server "apenas danado!", Mas pensei que não poderia ser feito. Então, eu vi isso.
David Hay
54

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

Sua mesa

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

As duas consultas resultam:
insira a descrição da imagem aqui

mxasim
fonte
Obrigado por esta resposta rara e clara. mostra imediatamente um exemplo e os conjuntos de dados resultantes
real_yggdrasil 7/10
Sei que isso é antigo, mas é a demonstração de pivô mais clara e melhor ilustrada que já vi.
Stan Shaw
52

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

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
Miles D
fonte
6

Bem, para sua amostra e qualquer uma 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
vzczc
fonte
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;
Vishwanath Dalvi
fonte
0

Eu tive uma situação em que estava analisando seqüências de caracteres e as duas primeiras posições da sequência 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 enfeites. 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 para todos os usuáriosz, ele 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 enviava uma solicitação de Benadryl, que valor eles enviavam nos campos F4, UR e UQ. Eu tinha um APLICATIVO EXTERNO que criou o ColTitle e os campos de valor abaixo

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