Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Roberto Fonseca

update + max

Recommended Posts

AMIGOS,Tenho a seguinte consulta no sql:select MAX (DataValidadeTabelaPreco), CodigoProduto from tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto.No resultado desse select, eu teria que aumentar em todas linhas o campo ValorTabelaPreco em 100%. Isso eu tentei com --update tbTabelaPreco Max (DataValidadeTabelaPreco) set ValorTabelaPreco = (ValorTabelaPreco)*2 where ValorTabelaPreco > 4.0000 Group BY CodigoProdutoPorém esta dando erro no MAX. Alguém pode me ajudar com essa sintaxe?Roberto Fonseca

Compartilhar este post


Link para o post
Compartilhar em outros sites

fala Roberto,

o esquema ai é fazer um update com inner e usar a sua consulta que ja ta funcionando no inner

 

exemplo:

--tabela virtual para testesdeclare @tbTabelaPreco table (CodigoProduto int, ValorTabelaPreco decimal(10,2), DataValidadeTabelaPreco datetime)insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (1, 3.500, '2007-05-10')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (1, 4.500, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (2, 1.000, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (3, 3.700, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (4, 5.000, '2007-05-13')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (4, 3.900, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (5, 4.100, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (6, 3.990, '2007-05-14')--linhas que irão sofrer a alteraçãoselect MAX(DataValidadeTabelaPreco) as DataValidadeTabelaPreco, CodigoProduto from @tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto--update somente nas linhas que tiverem na condição acimaupdate @tbTabelaPreco set ValorTabelaPreco = (ValorTabelaPreco)*2 from @tbTabelaPreco tb1inner join 	(select MAX (DataValidadeTabelaPreco) as DataValidadeTabelaPreco, CodigoProduto from @tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto) tb2on 	tb2.CodigoProduto = tb1.CodigoProduto and tb2.DataValidadeTabelaPreco = tb1.DataValidadeTabelaPreco--consulta com os novos valoresselect * from @tbTabelaPreco
dai é só adaptar e sair para o abraço

 

OBS.: faça um bom backup antes de executar essa parada toda... segurança nunca é d+

 

 

t++

força e honra

Compartilhar este post


Link para o post
Compartilhar em outros sites

a consulta esta correta mas na hora de voce atualizar esta com uma sitaxe estranha ve se com este UPDATE voce consegue fazer o que voce quer.update tbTabelaPrecoset ValorTabelaPreco = (ValorTabelaPreco)*2where DataValidadeTabelaPreco =(select MAX (DataValidadeTabelaPreco), CodigoProduto from tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto)

Compartilhar este post


Link para o post
Compartilhar em outros sites

a consulta esta correta mas na hora de voce atualizar esta com uma sitaxe estranha ve se com este UPDATE voce consegue fazer o que voce quer.update tbTabelaPrecoset ValorTabelaPreco = (ValorTabelaPreco)*2where DataValidadeTabelaPreco =(select MAX (DataValidadeTabelaPreco), CodigoProduto from tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto)

falai Dedairiki,não entendi, pelo que você passou o WHERE ta verificando o campo DataValidadeTabelaPreco em dois campos (select MAX (DataValidadeTabelaPreco), CodigoProduto...)nesta linha:where DataValidadeTabelaPreco =(select MAX (DataValidadeTabelaPreco), CodigoProdutodesta forma irá ocorrer o erro:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

se puder explica melhor ai pra nóisabs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa. coloquei um campo a mais na sub.este erro é por causa disso mesmo que voce falou mas é so retirar o CodigoProduto Assim:update tbTabelaPrecoset ValorTabelaPreco = (ValorTabelaPreco)*2where DataValidadeTabelaPreco =(select MAX (DataValidadeTabelaPreco) from tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto)caso o resultado da Sub retorne mais que um valor voce coloca o 'IN' no lugar do '=' att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara a consulta do Eriva_br está correta, é update fazendo com uma subquery, a sua consulta você não atentou-se no que subquery possuí duas chaves MAX (DataValidadeTabelaPreco) e CodigoProduto. O erro seria assim:Produto X DataVal: '20070518' Valor: R$ 45,00.Produto Y DataVal: '20070518' Valor: R$ 5.000,00Ele quer atualizar somente os que estão acima de 5000,00 e na consulta você está usando a data, note que os dois produtos possuem a mesma data a saída para a sua query seria colocar o where ValorTabelaPreco > 4.0000 depois do parentêses da subquery.Até mais,Renato J. C. Lima

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, obrigado pela força. A forma como Eriva passou foi a que funcionou....mas tipo sabe qndo tu faz algo e nao entende como fez, mas funciona? Eu queria saber se alguém pode me explicar o pq do tb1 e tb2 e se possivel também como eu faço para incrementar esse código ao inves de usar update eu poderia usar insert para criar uma nova linha e através dela eu alterar a data de validade para data de hoje. Pois assim eu manteria o histórico dos preços, pois com update eu vou estar alterando o ultimo preço que consta na tabela e apesar da minha atualização eu mataria o ultimo histórico...Roberto Fonseca

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, obrigado pela força. A forma como Eriva passou foi a que funcionou....mas tipo sabe qndo tu faz algo e nao entende como fez, mas funciona? Eu queria saber se alguém pode me explicar o pq do tb1 e tb2 ...

tb1 e tb2 são somente apelidos (alias, AS), são usados para facilitar, por exemplo para eu não escrever novamente no JOIN @tbTabelaPreco eu uso o apelido 'tb1' (chamei de tb1, mas apelido você pode colocar qual tu quiser, poderia ser por exemplo: TP (Tabela Preço), X, Y, Z...rss o melhor é usar siglas que facilitam

 

nesta linha com apelidos:

tb2.CodigoProduto = tb1.CodigoProduto and tb2.DataValidadeTabelaPreco = tb1.DataValidadeTabelaPreco

 

sem apelidos ficaria:

tb2.CodigoProduto = @tbTabelaPreco.CodigoProduto and tb2.DataValidadeTabelaPreco = @tbTabelaPreco.DataValidadeTabelaPreco

 

o resultado final é o mesmo

 

no caso do tb2 usei o apelido para não ter que criar uma tabela virtual antes de fazer o comando update

 

 

... e se possivel também como eu faço para incrementar esse código ao inves de usar update eu poderia usar insert para criar uma nova linha e através dela eu alterar a data de validade para data de hoje. Pois assim eu manteria o histórico dos preços, pois com update eu vou estar alterando o ultimo preço que consta na tabela e apesar da minha atualização eu mataria o ultimo histórico...

Neste caso não vai ter jeito de fugir de tabela virtual, pois se colocar o valor na consulta vai quebrar o agrupamento que tu precisa, é só criar uma virtual e depois fazer o insert baseado nela, mudando a data e valores, veja o exemplo abaixo comentado:

set nocount on--tabela virtual para testesdeclare @tbTabelaPreco table (CodigoProduto int, ValorTabelaPreco decimal(10,2), DataValidadeTabelaPreco datetime)insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (1, 3.500, '2007-05-10')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (1, 4.500, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (2, 1.000, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (3, 3.700, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (4, 5.000, '2007-05-13')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (4, 3.900, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (5, 4.100, '2007-05-14')insert into @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco) values (6, 3.990, '2007-05-14')set nocount oFF--SELECT ANTES: 8 REGISTROSselect * from @tbTabelaPreco--linhas que irão sofrer a inserção: 3 REGISTROS, vamos colocar ela numa tabela virtual com: INTO #TABVIRTUALselect MAX(DataValidadeTabelaPreco) as DataValidadeTabelaPreco, CodigoProduto INTO #TABVIRTUALfrom @tbTabelaPreco where ValorTabelaPreco > 4.0000 GROUP BY CodigoProduto--INSERT DOS 3 REGISTROS ACIMA, é só colocar o comando insert into, e não usar o VALUES, usar o SELECT da #TABVIRTUALINSERT INTO @tbTabelaPreco (CodigoProduto, ValorTabelaPreco, DataValidadeTabelaPreco)SELECT TBV.CodigoProduto, TBR.ValorTabelaPreco * 2, GETDATE()  FROM #TABVIRTUAL TBV --Apelido (Abreviação) TaBela VirtualINNER JOIN 	@tbTabelaPreco TBR --Apelido (Abreviação) TaBela RealON 	TBV.CodigoProduto = TBR.CodigoProduto and TBV.DataValidadeTabelaPreco = TBR.DataValidadeTabelaPreco--OBS.1: no caso fizemos um inner join com a tabela real para buscar o valor do produto e multiplica-los por 2--OBS.2: função GETDATE() para buscar o dia atual--consulta com os novos valores: 8 registros antigos + 3 registro novos = total 11 registrosselect * from @tbTabelaPreco--MATANDO TABELA VIRTUALDROP TABLE #TABVIRTUAL
dai é só adaptar ai pro seu uso...

 

 

abs

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.