Inserir resultado de calculo em uma tabela

08/08/2015

0

Pessoal,sou novo nesse mundo de banco de dados mas tem três semanas estudado muito principalmente mysql,estou fazendo um mini projeto para melhorar meus conhecimentos e tem dado bastante certo,porém esbarrei num ponto onde acho que minha falta de conhecimento esta me prejudicando.
Vamos ao projeto ,Preciso verificar o volume de vendas dos produtos o parâmetro que estou usando é a faixa de preço deles.
Faixas de preços estas "00.01 até 05.00" "05.01 até 10.00" "10.01 até 15.00" "15.01 até 20.00"

Para isso consegui criar a seguinte Querie

DROP TABLE IF EXISTS Consulta2;
CREATE TABLE rep.consulta2 (
`Faixa Preco` VARCHAR(255) NOT NULL DEFAULT '',
JulhoValor VARCHAR(255) DEFAULT NULL,
Julhoperc VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`Faixa Preco`)
)
ENGINE = INNODB
AVG_ROW_LENGTH = 4096
CHARACTER SET utf8
COLLATE utf8_general_ci;
INSERT INTO consulta2(`Faixa Preco`,JulhoValor) Values ("faixa05",(SELECT
SUM(pedidos.prvenda)
FROM pedidos
WHERE pedidos.dteminf BETWEEN '2013-06-01' AND '2013-06-30'
AND pedidos.prvenda >= '00.01' and prvenda <= '05.00'));

INSERT INTO consulta2(`Faixa Preco`,JulhoValor) Values ("faixa10",(SELECT
SUM(pedidos.prvenda)
FROM pedidos
WHERE pedidos.dteminf BETWEEN '2013-06-01' AND '2013-06-30'
AND pedidos.prvenda >= '05.01' and prvenda <= '10.00'));

INSERT INTO consulta2(`Faixa Preco`,JulhoValor) Values ("faixa15",(SELECT
SUM(pedidos.prvenda)
FROM pedidos
WHERE pedidos.dteminf BETWEEN '2013-06-01' AND '2013-06-30'
AND pedidos.prvenda >= '10.01' and prvenda <= '15.00'));

INSERT INTO consulta2(`Faixa Preco`,JulhoValor) Values ("faixa20",(SELECT
SUM(pedidos.prvenda)
FROM pedidos
WHERE pedidos.dteminf BETWEEN '2013-06-01' AND '2013-06-30'
AND pedidos.prvenda >= '15.01' and prvenda <= '20.00'));

INSERT INTO consulta2(`Faixa Preco`,JulhoValor) Values ("faixatotal",(SELECT
SUM(pedidos.prvenda)
FROM pedidos
WHERE pedidos.dteminf BETWEEN '2013-06-01' AND '2013-06-30'
AND pedidos.prvenda >= '00.01' ));

Que me deu o seguinte resultado
[img]http://arquivo.devmedia.com.br/forum/imagem/446449-20150808-231413.jpg[/img]

Agora vamos ao meu problema ,Não estou conseguinto inserir os valores na colunho " Julhoperc" que seria a coluna com o valor em percentual
Para conseguir calcular executei os seguintes comandos

UPDATE consulta2 SET JulhoValor=REPLACE(JulhoValor,'.',',') < Para substituir os pontos por virgulas

Consegui criar a querie que calcula o percentual
(Select (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixa05') / (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixatotal') * 100 )
Que retornou o seguinte resultado
[img]http://arquivo.devmedia.com.br/forum/imagem/446449-20150808-232236.jpg[/img]
Pronto isso é exatamente oq eu queria
Agora preciso inserir esse resultado na coluna "Julhoperc" onde " Faixa Preco" for Faixa05 porém todas minhas tentativas falharam

Tentei essa Querie com INSERT
INSERT INTO consulta2(Julhoperc)
SELECT (Select (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixa05') / (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixatotal') * 100 )
FROM Consulta2
WHERE 'faixa preco' = 'faixa05'

Tentei essa Querie com Update
UPDATE consulta2 set julhoperc = (Select (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixa05') / (Select JulhoValor FROM consulta2 WHERE `Faixa Preco` = 'faixatotal') * 100 ) faixa05 where faixapreco = faixa05

Por ultimo tentei uma querie sem indicar onde queria que o resultado do select ficasse,foi a Querie com o resultado mais próximo do que eu quero
[img]http://arquivo.devmedia.com.br/forum/imagem/446449-20150808-234827.jpg[/img]

Estou perdido estou pensando em fazer outra tabela e usar ela como referencia,mas acredito que dê para fazer nessa mesma
Quem puder me ajudar,estou usando ferramentas simples para isso e meu conhecimento ainda é muito limitado ,mas aprendo rápido...
Rodolfo

Rodolfo

Responder

Posts

09/08/2015

William

Colega Rodolfo, antes de postar a provável solução do seu problema vou passar algumas dicas para você:

1 - Por gentileza sempre que for postar trechos de código utilize a tag CODE, deixa o código mais legível.
[img]http://arquivo.devmedia.com.br/forum/imagem/269142-20150809-102815.png[/img]


2 - Padronize sua nomenclatura, veja a diferença no nome da tabela (Maiúsculo e Minúsculo), estude sobre padrões de nomenclatura Pascal Case e Camel Case.
DROP TABLE IF EXISTS Consulta2;
CREATE TABLE rep.consulta2


3 - Não crie campos com espaço, utilize underscore "_" para separar palavras:
`Faixa Preco` VARCHAR(255) NOT NULL DEFAULT '',


4 - Campos que recebem valores quer seja monetário ou porcentagem utilize o data type DECIMAL.
JulhoValor VARCHAR(255) DEFAULT NULL,


Agora vamos a provável solução do seu problema, o MySQL é um SGBD sensacional e possui algumas regras para UPDATE quando envolvemos a mesma tabela na subquery. A ideia é na subquery criar um resultset "temporário" para que o MySQL deixe atualizar a tabela que está sendo informada no UPDATE.
UPDATE consulta2 SET julhoperc = (JulhoValor / (SELECT JulhoValor FROM (SELECT JulhoValor FROM consulta2 WHERE FaixaPreco = 'faixatotal' LIMIT 1) AS temp)) * 100;


Veja se ajuda, qualquer coisa poste novamente!
Responder

09/08/2015

Rodolfo

Willian muito obrigado pela sua explicações ,fiz todas as alterações que vc citou... e sua queria funcionou perfeitamente.Além do que eu pensava...achei que teria que fazer 5 linhas de update porém,agora estou muito curioso sobre as funções que vc usou nessa query e como eu poderia fazer ela .

Outra coisa,tentei implementar esse update na minha query inicial porém,ele dá erro ...

Error (48,1): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE consulta2 SET julhoperc = (julhovalor / (SELECT julhovalor FROM (SELECT j' at line 4

mas quando eu executo ele individualmente ele funciona,sabe me dizer o está acontecendo

Mais uma vez muito obrigado pela sua ajuda vc conseguiu compreender exatamente onde eu queria chegar.
Responder

09/08/2015

William

Se você está tentando executar individualmente por registro tente colocar uma condição WHERE no UPDATE, informando o ID do registro que pretende atualizar.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar