Usuário com melhor resposta
Multiplicar linhas de uma tabela de acordo com o valor de uma coluna da mesma linha.

Pergunta
-
Boa noite!
Gostaria de montar um Consulta que me retorne o seguinte valores:
Por Ex:
Tabela NomeTabela
Código Total de Pontos Data 33000 3 01/01/2014 33001 4 02/01/2014 Me retornar da seguinte maneira
Consulta
Código Total de Pontos Data 33000 3 01/01/2014 33000 2 01/01/2014 33000 1 01/01/2014 33001 4 02/01/2014 33001 3 02/01/2014 33001 2 02/01/2014 33001 1 02/01/2014 tenho uma aqui que sai o resultado parecido, porem tenho que acrescentar cada um union all select para cada lilha duplicada e cada Ponto da tabela pode ter o valor de até 999 e ficaria invavel fazer 999 union all select.
segue minha consulta
SELECT código, [Total de Pontos], data
FROM NomeTabela
UNION ALL
SELECT código, [Total de Pontos] - 1 , data
FROM NomeTabela
WHERE ([Total de Pontos] - 1 > 0)
UNION ALL
SELECT código, [Total de Pontos] - 2, data
FROM NomeTabela
WHERE ([Total de Pontos] - 2 > 0)se alguém tiver uma maneira mais fácil de fazer essa consulta por favor....
obrigado!
Respostas
Todas as Respostas
-
-
Uma abordagem é criar tabela auxiliar de números, contendo os valores 999 a 1, e montar cross join com a tabela de pontuação.
Algo assim:
-- código 1 v3 set NOCOUNT ON;
-- cria tabela auxiliar de números
if Object_ID('tempdb..#Numeros','U') is not null drop table #Numeros; create table #Numeros (Num int primary key); declare @I int; set @I= 999; while @I > 0 begin insert into #Numeros values (@I); set @I= @I - 1; end; go --
SELECT T.Código, N.Num as Pontos, convert(char(10), T.Data, 103) as Data from NomeTabela as T cross join #Numeros as N where Num <= T.Pontos
order by T.Código asc, Pontos desc; go --drop table #Numeros;
Para testar:
-- tamborete set NOCOUNT ON; create table NomeTabela (Código int primary key, Pontos int, Data date); set dateformat dmy; insert into NomeTabela values (33000, 3, '1/1/2014'), (33001, 4, '2/1/2014'); go
José Diz Belo Horizonte, MG - Brasil
(Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)
José,
Cara não entendi o porque você criou um laço para popular a sua table, se poderiamos fazer uso do Go, com a coluna Num utilizando o Identity, utilizando a claúsula default Values.
Veja este exemplo:
create table #Numeros (Num int primary key Identity(1,1); Go Insert into #Numeros default values Go 999
Evitar o uso de Laço e Cursores é uma boa prática.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
-
José,
Perfeito, sim realmente é um laço, mesmo que interno é realizado de uma única vez.
Eu conheço este método do Itzik. Mas foi realmente um comentário.
Então, eu particularmente prefiro uma table auxiliar até mesmo temporária.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
Ok, Obrigado pessoal, vcs me ajudaram muito deu certo aqui, ficou como eu queria.
Porem tenho outra duvida, na mesma consulta, preciso fazer com que um coluna me retorno valores aleatórios menores que o original totalizando no valor original com por ex.
Tabela NomeTabela
Código Total de Pontos Data Valor1 33000 3 01/01/2014 10 33001 5 02/01/2014
20 Me retornar da seguinte maneira
Consulta
Código Total de Pontos Data Valor1 33000 3 01/01/2014 2 33000 2 01/01/2014 5 33000 1 01/01/2014 3 33001 5 02/01/2014 5 33001 4 02/01/2014 4 33001 3 02/01/2014 0 33001 2 02/01/2014 8 33001 1 02/01/2014 3 Aguem tem alguma ideia?
-
-
-
Muito Obrigado pela ajuda, porem não estou conseguindo implantar esse código em minha consulta pois gera um erro, Obs: estou tentando implantar esse código na consulta de um banco em Access através do Visual Studio 10, porem o criador de consulta sql é muito limitado, será que vcs podem me ajudar, O "cross join" consegui implantar apenas o "Rand()" não consegui.
- Editado Cleitonti sábado, 8 de março de 2014 16:48
-
-
Cleiton, avalie o uso da função Rnd(), do Access.
José Diz Belo Horizonte, MG - Brasil
(Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)
José, Como faço isso? sou iniciante e ainda não sei muita coisa, seque minha sql.
INSERT INTO TempCigarrinha
(Coletor, Data, Fazenda, Zona, Talhao, [Total de Pontos], [Sit da Palha], [Ninfas Vivas], [Adultos Vivos], [Ninfas parasitada], [Adultos parasitado], [N Lev])
SELECT T.Coletor, T.Data, T.Fazenda, T.Zona, T.Talhao, N.Num AS [Total de Pontos], T.[Sit da Palha], T.[Ninfas Vivas], T.[Adultos Vivos], T.[Ninfas parasitada],
T.[Adultos parasitado], T.[N Lev]
FROM (Cigarrinha T INNER JOIN
Numeros N ON T.[Total de Pontos] >= N.Num) -
-
Ok, muito obrigado pela ajuda, até consegui usar o RND() porem ele só me gera numeros aleatórios que o valor maximo é o que consta em "T.Valor1", mais na verdade eu quero que gere os números aleatórios porem que somando as linhas seja o mesmo valor do "T.Valor1" original.
Original Código Pontos Data Valor1 33000 3 01/01/2014 10 Resultado Código Pontos Data Valor1 33000 1 01/01/2014
2
33000 2 01/01/2014 5 33000 3 01/01/2014 3
Soma Valor1 = 10