Usuário com melhor resposta
SELECT UNPIVOT

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