none
SELECT UNPIVOT RRS feed

  • Pergunta

  • Bom dia,

    Preciso fazer um SELECT de Colunas em Linhas, mas esse esta um pouco mais complicado, mesmo pesquisando e vendo exemplos nao estou conseguindo fazer.

    Trata-se um Categorias de torneio de tenis com premiação em dinheiro:

    CREATE TABLE Torneio_Categoria (ID INT IDENTITY(1, 1), 
                                    Nome VARCHAR(50), 
                                    Premiacao_Campeao_08_10 DECIMAL(18, 2), 
                                    Premiacao_Campeao_11_20 DECIMAL(18, 2), 
                                    Premiacao_Campeao_21 DECIMAL(18, 2), 
                                    Premiacao_Vice_08_10 DECIMAL(18, 2), 
                                    Premiacao_Vice_11_20 DECIMAL(18, 2), 
                                    Premiacao_Vice_21 DECIMAL(18, 2), 
                                    Premiacao_Semi_08_10 DECIMAL(18, 2), 
                                    Premiacao_Semi_11_20 DECIMAL(18, 2), 
                                    Premiacao_Semi_21 DECIMAL(18, 2), 
                                    Premiacao_Quartas_08_10 DECIMAL(18, 2), 
                                    Premiacao_Quartas_11_20 DECIMAL(18, 2), 
                                    Premiacao_Quartas_21 DECIMAL(18, 2))
    GO
    
    INSERT INTO Torneio_Categoria (Nome, Premiacao_Campeao_08_10, Premiacao_Campeao_11_20, Premiacao_Campeao_21, Premiacao_Vice_08_10, Premiacao_Vice_11_20, Premiacao_Vice_21, Premiacao_Semi_08_10, Premiacao_Semi_11_20, Premiacao_Semi_21, Premiacao_Quartas_08_10, Premiacao_Quartas_11_20, Premiacao_Quartas_21)
                            VALUES('1ª Classe (Especial)', 300, 400, 500, 150, 200, 250, 75, 100, 125, 0, 0, 0)
    GO
    
    INSERT INTO Torneio_Categoria (Nome, Premiacao_Campeao_08_10, Premiacao_Campeao_11_20, Premiacao_Campeao_21, Premiacao_Vice_08_10, Premiacao_Vice_11_20, Premiacao_Vice_21, Premiacao_Semi_08_10, Premiacao_Semi_11_20, Premiacao_Semi_21, Premiacao_Quartas_08_10, Premiacao_Quartas_11_20, Premiacao_Quartas_21)
                            VALUES('2ª Classe (A)', 200, 300, 400, 100, 150, 200, 0, 0, 0, 0, 0, 0)
    GO
    
    INSERT INTO Torneio_Categoria (Nome, Premiacao_Campeao_08_10, Premiacao_Campeao_11_20, Premiacao_Campeao_21, Premiacao_Vice_08_10, Premiacao_Vice_11_20, Premiacao_Vice_21, Premiacao_Semi_08_10, Premiacao_Semi_11_20, Premiacao_Semi_21, Premiacao_Quartas_08_10, Premiacao_Quartas_11_20, Premiacao_Quartas_21)
                            VALUES('3ª Classe (B)', 100, 200, 300, 50, 100, 150, 0, 0, 0, 0, 0, 0)
    GO
    
    Preciso de um SELECT que retorne dessa forma:
    
    ID Nome                 Para     08 a 10   11 a 20   Mais 21
    1  1ª Classe (Especial) Campeao  300,00    400,00    500,00
    1  1ª Classe (Especial) Vice     150,00    200,00    250,00
    1  1ª Classe (Especial) Semi      75,00    100,00    125,00
    1  1ª Classe (Especial) Quartas    0,00      0,00      0,00
    2
    3

    Obrigado!

    sexta-feira, 11 de março de 2016 11:46

Respostas

  • Bom dia,

    O código abaixo faz exatamente o que você precisa, porém, é apenas uma das maneiras possíveis de fazer, o ideal que analise qual melhor solução para essa situação.

    WITH TORNEIO 
    AS
    (
        SELECT TC.ID,
    	   TC.NOME + ' CAMPEAO ' AS NAME,
    	   TC.PREMIACAO_CAMPEAO_08_10,
    	   TC.PREMIACAO_CAMPEAO_11_20,
    	   TC.PREMIACAO_CAMPEAO_21,
    	   1 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' VICE ' AS NAME,
    	   TC.PREMIACAO_VICE_08_10,
    	   TC.PREMIACAO_VICE_11_20,
    	   TC.PREMIACAO_VICE_21,
    	   2 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' SEMI ' AS NAME,
    	   TC.PREMIACAO_SEMI_08_10,
    	   TC.PREMIACAO_SEMI_11_20,
    	   TC.PREMIACAO_SEMI_21,
    	   3 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' QUARTAS ' AS NAME,
    	   TC.PREMIACAO_QUARTAS_08_10,
    	   TC.PREMIACAO_QUARTAS_11_20,
    	   TC.PREMIACAO_QUARTAS_21,
    	   4 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
    )
    
    SELECT *
    FROM TORNEIO
    ORDER BY ORDEM


    Atenciosamente, Ruberlei. www.t-sql.com.br


    • Editado Ruberlei sexta-feira, 11 de março de 2016 12:28
    • Sugerido como Resposta Ruberlei sexta-feira, 11 de março de 2016 12:29
    • Marcado como Resposta DaviSaba sexta-feira, 11 de março de 2016 12:37
    sexta-feira, 11 de março de 2016 12:28

Todas as Respostas

  • Bom dia,

    O código abaixo faz exatamente o que você precisa, porém, é apenas uma das maneiras possíveis de fazer, o ideal que analise qual melhor solução para essa situação.

    WITH TORNEIO 
    AS
    (
        SELECT TC.ID,
    	   TC.NOME + ' CAMPEAO ' AS NAME,
    	   TC.PREMIACAO_CAMPEAO_08_10,
    	   TC.PREMIACAO_CAMPEAO_11_20,
    	   TC.PREMIACAO_CAMPEAO_21,
    	   1 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' VICE ' AS NAME,
    	   TC.PREMIACAO_VICE_08_10,
    	   TC.PREMIACAO_VICE_11_20,
    	   TC.PREMIACAO_VICE_21,
    	   2 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' SEMI ' AS NAME,
    	   TC.PREMIACAO_SEMI_08_10,
    	   TC.PREMIACAO_SEMI_11_20,
    	   TC.PREMIACAO_SEMI_21,
    	   3 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
        UNION
        SELECT TC.ID,
    	   TC.NOME + ' QUARTAS ' AS NAME,
    	   TC.PREMIACAO_QUARTAS_08_10,
    	   TC.PREMIACAO_QUARTAS_11_20,
    	   TC.PREMIACAO_QUARTAS_21,
    	   4 AS ORDEM
        FROM TORNEIO_CATEGORIA TC   
        WHERE TC.ID = 1
    )
    
    SELECT *
    FROM TORNEIO
    ORDER BY ORDEM


    Atenciosamente, Ruberlei. www.t-sql.com.br


    • Editado Ruberlei sexta-feira, 11 de março de 2016 12:28
    • Sugerido como Resposta Ruberlei sexta-feira, 11 de março de 2016 12:29
    • Marcado como Resposta DaviSaba sexta-feira, 11 de março de 2016 12:37
    sexta-feira, 11 de março de 2016 12:28
  • Bom dia,

    DaviSaba, segue outra sugestão para teste:

    select
        ID,
        Nome,
        Resultado,
        [08_10],
        [11_20],
        [21]
    from
    (
    	select
    		ID,
    		Nome, 
    		SUBSTRING(Resultado, 11, CHARINDEX('_', Resultado, 12) - 11) as Resultado,
    		SUBSTRING(Resultado, CHARINDEX('_', Resultado, 12) + 1, 5) as Faixa,
    		Premiacao
    	from Torneio_Categoria
    	unpivot
    	(
    		Premiacao for Resultado in 
    			(Premiacao_Campeao_08_10, 
    			 Premiacao_Campeao_11_20, 
    			 Premiacao_Campeao_21,
    			 Premiacao_Vice_08_10,
    			 Premiacao_Vice_11_20,
    			 Premiacao_Vice_21,
    			 Premiacao_Semi_08_10,
    			 Premiacao_Semi_11_20,
    			 Premiacao_Semi_21,
    			 Premiacao_Quartas_08_10,
    			 Premiacao_Quartas_11_20,
    			 Premiacao_Quartas_21)
    	) as u
    ) as t
    pivot
    (
        max(Premiacao) for Faixa in ([08_10], [11_20], [21])
    ) as p
    order by
        ID,
        [08_10] desc

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 11 de março de 2016 12:35
  • Obrigado!
    sexta-feira, 11 de março de 2016 12:37