PIVOT no servidor SQL 2012-novo em SQL [duplicado]

esta pergunta já tem uma resposta aqui:

Estou a ter alguns problemas com a próxima situação: preciso de seleccionar 4 posições para uma declaração e preciso que estas posições sejam giradas como colunas. A base de dados está estruturada como: StatementId 1, PositionId 2, RepCurrValue 3. Por exemplo, para StatementId = 55 e para as posições = 58, 62 ou 67 ou 82 o resultado é:

1   2   3
-----------------
55  58  146,8000
55  62  59,9800
55  67  800,0500
55  82  136,7600

e quero que seja

1  58       62      67       82
---------------------------------------
55 146,8000 59,9800 800,0500 136,7600
Muito obrigado pelo vosso apoio.

Author: marc_s, 2016-07-14

1 answers

Fiz este exercício com uma tabela de pivô que poderia ajudar-te, considerando os títulos das colunas iguais ao conteúdo do campo [2] e não fornecendo valores repetidos na coluna [2]:

DECLARE @cols AS NVARCHAR(MAX)

SET @cols =  STUFF((SELECT ',[' + convert(nvarchar,(t.[2])) + ']'  AS ID
 FROM TB_1 t
  FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1, '')

DECLARE  @query  AS NVARCHAR(MAX);  

SET @query = N'SELECT p.[1],' + @cols + N' from 
             (
                SELECT [1],[2],[3] FROM TB_1
            ) x
            pivot 
            (
                max([3])
                for [2] in (' + @cols + N')
            ) p 

            '
exec sp_executesql @query;

Abaixo do resultado obtido adicionando um StatementId (56) adicional e novas posições diferentes (90,91) associadas ao StatementId (56)

1   58          62      67          82          90      91
55  146,8000    59,9800 800,0500    136,7600    NULL    NULL
56  NULL        NULL    NULL        NULL        185,74  185,74

Uma solução não dinâmica pode ser:

select *
from 
(
   SELECT [1],[2],[3] FROM TB_1 
) x
pivot
(
  max([3])
  for [2] in ([58] , [62] , [67] , [82] )
) p
 0
Author: ɐlǝx, 2016-07-14 11:18:30