Ir para conteúdo

POWERED BY:

Arquivado

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

Diego Gonçalves

Comando IF

Recommended Posts

Fala pessoal,

 

Nunca achei que iria precisar disso...

 

Preciso verificar se a coluna grupo é = 1, se positivo, acumula somatório em RECEITA;

Se negativo, Acumula somatório em DESPESAS;

 

Depois preciso pegar os dois somatórios e fazer RECEITA - DESPESAS.

 

Navicat e View.

 

Caso alguém puder ajudar, eu agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Queres fazer usando Function, Procedure... ? Posta o código, a estrutura das tabelas e o "contexto" do que você precisa fazer aí man.

 

Estarei no aguardo, abrass.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando fazer sem a utilização de procedures, functions etc. Estou tentando fazer diretamente na view.

 

select `movimentacao`.`MES` AS `MES`,`movimentacao`.`ANO` AS `ANO`,`movimentacao`.`ID_GRUPO` AS `ID_GRUPO`,`movimentacao`.`GRUPO` AS `GRUPO`,sum(`movimentacao`.`VALOR`) AS `VALOR`,`movimentacao`.`Franquia` AS `Franquia` from `movimentacao` where ((`movimentacao`.`ID_GRUPO` <> 10) and (`movimentacao`.`ID_CATEGORIA` <> 45)) group by `movimentacao`.`MES`,`movimentacao`.`ANO`,`movimentacao`.`ID_GRUPO`

 

Olhem, consegui uma parte do que preciso, fazendo assim:

 

IF (ID_GRUPO = 1, Sum(Valor),0) As Receita

IF (ID_GRUPO <> 1, Sum(Valor),0) As Despesa

 

Mas na hora de subtrair resultado do primeiro pelo resultado do segundo da erro:

Sum(Receita - Despesa)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi o que você quer fazer, não entendi o como e onde. Você quer colocar esses IFs dentro do SELECT da VIEW ou quer ustilizá-lo depois? Esses IF substituíriam o lugar do ID_GRUPO no SELECT ou seriam 2 novas colunas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi o que você quer fazer, não entendi o como e onde. Você quer colocar esses IFs dentro do SELECT da VIEW ou quer ustilizá-lo depois? Esses IF substituíriam o lugar do ID_GRUPO no SELECT ou seriam 2 novas colunas?

 

Amigo,

 

Preciso verificar o grupo de conta e direcionar o valor (RECEITA OU DESPESAS). Como nunca utilizei esse tipo de teste em SQL, não sei se estou fazendo no lugar e/ou da forma correta.

 

Mas basicamente é isso, verificar se o id_grupo de conta é = a 1, se verdadeiro: RECEITAS, se falso: DESPESAS;

 

Depois eu tenho que subtrair das RECEITAS as DESPESAS e jogar para RESULTADO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok to raciocinando agora.

 

Única dúvida: Esse resultado seria um total de toda a VIEW? Por exemplo você tem 10 registros na VW, 4 são DESPESA e 6 são RECEITA. Você vai somar todos os RECEITA, todos os DESPESA e totalizar algo? Porque se você tá tentando colocar uma coluna RESULTADO para cada registro eu realmente não entendi e não saberei ajudar.

 

Novamente, se puder postar as tabelas que você tá usando pra montar essa VW será melhor.

 

Estou tentando ajudar, peço compreensão e paciência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok to raciocinando agora.

 

Única dúvida: Esse resultado seria um total de toda a VIEW? Por exemplo você tem 10 registros na VW, 4 são DESPESA e 6 são RECEITA. Você vai somar todos os RECEITA, todos os DESPESA e totalizar algo? Porque se você tá tentando colocar uma coluna RESULTADO para cada registro eu realmente não entendi e não saberei ajudar.

 

Novamente, se puder postar as tabelas que você tá usando pra montar essa VW será melhor.

 

Estou tentando ajudar, peço compreensão e paciência.

É por aí, mas ao invés de toda a VIEW, de todo o Mês/Ano (período);

 

Mas deixa eu tentar esclarecer um pouco mais:

 

O sistema é para controle financeiro. E existem os grupos de contas (Receita, Custo fixo, Custo variável, Despesa fixa...).

A estrutura da tabela MOVIMENTACAO é:

MES VARCHAR;

ANO VARCHAR;

ID_GRUPO INT; // AQUI É DEFINIDO O TIPO DO REGISTRO (RECEITA/DESPESA);

GRUPO VARCHAR;

...

 

Essa VIEW já me mostra o resultado agrupando pelo período, id_grupo os valores corretamente, Exemplo: MES> 1 ANO> 2011 RECEITA> 120.000,00 CUSTO_FIXO> 15.000,00 DESP_FIXA> 8.000,00 ...

 

Agora eu preciso pegar RECEITA e tirar dela todas as DESPESAS.

 

 

Quanto a paciência e compreensão, eu que lhe peço, já agradecendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, trabalho com um sistema que também possue depesas e receitas. Bom, cada registro na MOVIMENTACAO pode ser uma despesa ou receita, certo.

 

Na VW você tá agrupando tudo de 1 mês só de cada ano, ok.

 

Eu entendi mas tá difícil aqui, to fazendo uns testes hehe

 

Bom eu fiz uma VW aqui com a query que você passou e ele traz agrupado o mês e o valor da receita ou despesa. 1 mês pra cada um. Exemplo:

 

MÊS | ID_GRUPO | RECEITA | DESPESA   
----------------------------------
01 |     1    |  20.00  |  0.00
01 |     2    |   0.00  | 10.00
02 |     1    |  40.00  |  0.00
02 |     2    |   0.00  | 15.00

Traz os valores de receita e despesa de cada mês separados um do outro, justamente por causa do GROUP pelo ID_GRUPO. Acredito que eu esteja no caminho da coisa até aqui. Agora, o que você precisa é fazer tudo num só certo?

 

Teria que criar outra VIEW não? Exemplo:

 

SELECT ... CAMPOS ... (RECEITA - DESPESA) AS TOTAL FROM VW_MOVIMENTACAO

 

Porque se você tirar o GROUP BY ID_GRUPO da primeira query ele não traz o que você quer, e se você deixá-lo ele vai trazer separado ainda.

 

---------------------

 

Opa, consegui eu acho:

 

CREATE OR REPLACE VIEW VW_MOV AS
      SELECT X.MES AS A, X.ANO AS B, X.ID_GRUPO AS I, X.GRUPO AS G,
      (SELECT SUM(VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO  = 1 AND N.MES = A AND N.ANO = B) - 
      (SELECT SUM(VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO <> 1 AND N.MES = A AND N.ANO = B) AS TOTAL
FROM MOVIMENTACAO AS X WHERE X.ID_GRUPO <> 10 GROUP BY A, B

Mas só consegui usando todos os alias ali certinho, você pode mudar pelos nomes que você quiser mas mantém a essência da coisa que é separar os campos da subquery da principal. Se for isso o que você quer mesmo né.

 

Qualquer coisa dá um toque ae que respondo depois, to indo pra aula. Abrass.

 

Observação que notei agora: Se o retorno de uma das colunas for NULL (Despesa ou Receita) o total será NULL também. Sugiro então fazer umas validações ali, ou então crie uma FUNCTION pra retornar ZERO quando algo for NULL, você pode utilizá-la no resto de seu sistema ainda. Não sei, quem sabe já exista uma assim do próprio MySQL, eu desconheço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu passei por isso aqui também, mas tinha corrigido... Perai deixa eu ver aqui...

 

Sim como eu disse uma questão crítica nesta nossa consulta são os alias, me posta a tua query quero ver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu passei por isso aqui também, mas tinha corrigido... Perai deixa eu ver aqui...

 

Sim como eu disse uma questão crítica nesta nossa consulta são os alias, me posta a tua query quero ver.

 

Segue:

VIEW `vmovimentacao` AS 
SELECT
movimentacao.MES AS MES,
movimentacao.ANO AS ANO,
movimentacao.ID_GRUPO AS ID_GRUPO,
movimentacao.GRUPO AS GRUPO,
sum(`movimentacao`.`VALOR`) AS VALOR,
(SELECT SUM(VALOR) FROM movimentacao AS N WHERE N.ID_GRUPO  = 1 AND N.MES = MES AND N.ANO = ANO) - (SELECT SUM(VALOR) FROM movimentacao AS N WHERE N.ID_GRUPO <> 1 AND N.MES = MES AND N.ANO = ANO) AS TOTAL
from `movimentacao`
where ((`movimentacao`.`ID_GRUPO` <> 10) and (`movimentacao`.`ID_CATEGORIA` <> 45))
group by `movimentacao`.`MES`,`movimentacao`.`ANO`,`movimentacao`.`ID_GRUPO` ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eram os alias mesmo. Segue a minha sugestão de query, eu sempre trabalho com os alias nos nomes dos campos:

 

CREATE VIEW vwmovimentacao AS 
    SELECT
          M.MES AS MES, -- Observe que aqui nós deixamos evidenciado que queremos o MES do alias M
          M.ANO AS ANO, -- Observe que aqui nós deixamos evidenciado que queremos o ANO do alias M
          M.ID_GRUPO AS ID_GRUPO,
          M.GRUPO AS GRUPO,
          SUM(M.VALOR) AS VALOR,
          -- Note nessa parte abaixo do código nós criamos outro alias pra tabela movimentacao, desta vez como 'N'
          -- Sendo assim na cláusula WHERE desta subquery nós dizemos que queremos pegar o SUM(VALOR) apenas onde 
          -- o N.MES e o N.ANO (alias da subquery) forem iguais ao M.MES e ao M.ANO (alias principal)
          ((SELECT SUM(N.VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO  = 1 AND N.MES = M.MES AND N.ANO = M.ANO) - 
           (SELECT SUM(N.VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO <> 1 AND N.MES = M.MES AND N.ANO = M.ANO)) AS TOTAL
    FROM MOVIMENTACAO AS M -- Criamos o alias da tabela movimentacao como 'M'
    WHERE ((M.ID_GRUPO <> 10) AND (M.ID_CATEGORIA <> 45))
    GROUP BY M.MES, M.ANO, M.ID_GRUPO;

 

Ou seja, o erro era porque não estávamos dizendo que queríamos pegar apenas do MES e ANO correntes na consulta principal. Sendo assim ele pegava o valor total de tudo sempre, por isso os resultados eram todos iguais. Execute assim e veja se fez diferença.

 

É como se fosse uma espécie de buffer em que estamos analisando a subquery de acordo com o registro corrente no buffer da principal.

 

Qualquer dúvida do porquê desta maneira ou referente a query, disponha =]

 

Abrass.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eram os alias mesmo. Segue a minha sugestão de query, eu sempre trabalho com os alias nos nomes dos campos:

 

CREATE VIEW vwmovimentacao AS 
    SELECT
          M.MES AS MES, -- Observe que aqui nós deixamos evidenciado que queremos o MES do alias M
          M.ANO AS ANO, -- Observe que aqui nós deixamos evidenciado que queremos o ANO do alias M
          M.ID_GRUPO AS ID_GRUPO,
          M.GRUPO AS GRUPO,
          SUM(M.VALOR) AS VALOR,
          -- Note nessa parte abaixo do código nós criamos outro alias pra tabela movimentacao, desta vez como 'N'
          -- Sendo assim na cláusula WHERE desta subquery nós dizemos que queremos pegar o SUM(VALOR) apenas onde 
          -- o N.MES e o N.ANO (alias da subquery) forem iguais ao M.MES e ao M.ANO (alias principal)
          ((SELECT SUM(N.VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO  = 1 AND N.MES = M.MES AND N.ANO = M.ANO) - 
           (SELECT SUM(N.VALOR) FROM MOVIMENTACAO AS N WHERE N.ID_GRUPO <> 1 AND N.MES = M.MES AND N.ANO = M.ANO)) AS TOTAL
    FROM MOVIMENTACAO AS M -- Criamos o alias da tabela movimentacao como 'M'
    WHERE ((M.ID_GRUPO <> 10) AND (M.ID_CATEGORIA <> 45))
    GROUP BY M.MES, M.ANO, M.ID_GRUPO;

 

Ou seja, o erro era porque não estávamos dizendo que queríamos pegar apenas do MES e ANO correntes na consulta principal. Sendo assim ele pegava o valor total de tudo sempre, por isso os resultados eram todos iguais. Execute assim e veja se fez diferença.

 

É como se fosse uma espécie de buffer em que estamos analisando a subquery de acordo com o registro corrente no buffer da principal.

 

Qualquer dúvida do porquê desta maneira ou referente a query, disponha =]

 

Abrass.

 

Ixi, só mudou valor:

x.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cacete, aqui tá tudo ok...

 

Posta um pedaço dos dados que você tem no banco aqui cara quero simular com teus dados.

 

Esquece, já entendi. Tá certo cara... Só porque você tá agrupando pelo ID_GRUPO também, aí para cada ID_GRUPO o valor se repete. Eu tinha tirado, você colocou ele de novo então eu deixei. Mas experimenta tirar o ID_GRUPO do GROUP BY pra você ver...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala pessoal,

Nunca achei que iria precisar disso...

Preciso verificar se a coluna grupo é = 1, se positivo, acumula somatório em RECEITA;
Se negativo, Acumula somatório em DESPESAS;

Depois preciso pegar os dois somatórios e fazer RECEITA - DESPESAS.

Navicat e View.

Caso alguém puder ajudar, eu agradeço.

 

 

SELECT SUM( IF ( campo_receita > 0 AND grupo = 1)  ) AS RECEITA,
SUM( if (campo_receita => 0 AND grupo = 1)  AS DESPESAS,
(RECEITA - DESPESAS) AS TOTAL,
ID_EMPRESA as ID
FROM Tabela WHERE 1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utiliza uma tabela auxiliar e depois faz um insert select para popular e calcular depois de uma vez. É mais fácil e prático, depois pode colocar numa procedure que funcionar que é uma beleza!

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.