Ir para conteúdo

POWERED BY:

Arquivado

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

vanhelmont

SELECT com 2 SUM

Recommended Posts

Olá amigos sou recém-registrado no forum, mas acompanho a um bom tempo, e gostaria de sabe se podem me ajudar numa duvida que tenho, e não consigo resolver, pois bem... vou ser mais claro`:

 

CREATE TABLE `contas` (
  `tipo` char(10) NOT NULL,
  `data` date DEFAULT NULL,
  `valor` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `contas` VALUES ('receber', '2010-08-17', '150.00');
INSERT INTO `contas` VALUES ('receber', '2010-10-17', '150.00');
INSERT INTO `contas` VALUES ('pagar', '2010-08-17', '150.00');

gostaria fazer um select da soma dos valores a receber e a pagar de uma determinada data, no seguinte formato:

 

data | saídas | entradas

 

onde saídas é a soma de todas as contas do tipo "pagar", e entradas as do tipo "receber", ambos de uma mesma data.

 

Problema: não consigo fazer a seleção com 2 condições em uma mesma tabela... http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

SELECT
contas.`data`,
contas.valor AS entradas,
contas.valor AS saidas
FROM
contas
WHERE
contas.tipo = 'receber' AND
contas.tipo = 'pagar'
GROUP BY
receber.`data`

Preciso dessa ajuda galera, vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT contas.`data`,
SUM(contas.valor) AS entradas,
SUM(contas.valor) AS saidas
FROM
contas
GROUP BY
receber.`data`
HEAVING entradas = 'receber' 
AND     saidas = 'pagar'

 

nunca lembro se o heaving vem antes ou depois do group by.... e tb nao sei se ele funciona com os labels... como eh o mesmo campo talvez nao de pra fazer assim...

 

aí a única solucao que vejo eh fazer 2 subselect para essa soma...

 

pera ae que viajei com o SQL...

 

SELECT contas.`data`,
(SELECT SUM(valor) from contas where tipo = 'receber') AS entradas,
(SELECT SUM(valor) from contas where tipo = 'pagar') AS saidas
FROM
contas
GROUP BY
receber.`data`

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um registro não pode ser a pagar e a receber ao mesmo tempo, use OR ou IN.

 

SELECT
contas.`data`,
contas.valor AS entradas,
contas.valor AS saidas
FROM
contas
WHERE
contas.tipo = 'receber' OR
contas.tipo = 'pagar'
GROUP BY
receber.`data`

ou

 

SELECT
contas.`data`,
contas.valor AS entradas,
contas.valor AS saidas
FROM
contas
WHERE
contas.tipo in ('receber','pagar')
GROUP BY
receber.`data`

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta beleza, seu sql tá quase funcional, o problema é o seguinte..

 

tabela...

tipo data valor

receber 2010-08-17 150

receber 2010-10-17 150

pagar 2010-08-17 150

 

resultado...

data entradas saidas

2010-08-17 150 150

2010-10-17 150 150

 

não houve essas saidas, existe como mostrar 0 nessa situação?

 

"EuToComProblema!", vlw pela ajuda, não sabia usar esses comandos ainda, se puder me ajudar denovo vlw mano

Compartilhar este post


Link para o post
Compartilhar em outros sites

ficaria assim?

 

SELECT
contas.`data`,
IF (SUM(contas.valor) = NULL, '0', contas.valor) AS entradas,
IF (SUM(contas.valor) = NULL, '0', contas.valor) AS saidas
FROM
contas
WHERE
contas.tipo = 'receber' OR
contas.tipo = 'pagar'
GROUP BY
contas.`data`

Se for isso o meu problema continua... o 150 lá continua aparecendo,

 

caso esteja usando o if de madeira errada, alguem dá um toque e Motta o Select é de somar tem um SUM nos valores de entrada e saidas do dia especifico.

 

tenta fazer com os valores aqui, pra ficar mais facil... tudo 150 foi pra lascar a atenção de qualquer um mesmo, desculpa

tipo	data	valor
receber	2010-08-17	2
receber	2010-10-17	9
pagar	2010-08-17	4

Motta, será preciso fazer um subselect com a data, pra mostrar 0 caso não tenha? tipo, seleciona a soma das entradas do dia tal?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz o case retornando o valor ou 0 e um sum disto, como no exemplo, o resultado fica numa coluna.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, tentei entender o que você falou, apesar de não saber fazer eu tentei e consegui

 

veja ai o código:

 

SELECT
contas.`data`,
SUM(CASE WHEN  contas.valor <> '' AND contas.tipo = 'receber' THEN contas.valor ELSE 0 END) AS entradas,
SUM(CASE WHEN  contas.valor <> '' AND contas.tipo = 'pagar' THEN contas.valor ELSE 0 END) AS saidas
FROM
contas
GROUP BY
contas.`data`

vlw mesmo ein, c manja da parada do procedimento ;D

 

heheheh brigado mano

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta só pra finalizar...

 

a query ficou desse jeito ai em cima... mas agora eu gostaria de selecionar a diferença entre a entrada e a saida

 

porém mostra um erro dizendo que não existe as colunas, `entradas` e `saidas`, o que realmente não tem, como faço pra usar o nome da SELECT... AS

 

SELECT

contas.`data`,

SUM(CASE WHEN contas.valor <> '' AND contas.tipo = 'receber' THEN contas.valor ELSE 0 END) AS entradas,

SUM(CASE WHEN contas.valor <> '' AND contas.tipo = 'pagar' THEN contas.valor ELSE 0 END) AS saidas,

(`entradas` - `saidas`) AS total

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT

contas.`data`,

SUM(CASE WHEN contas.valor <> '' AND contas.tipo = 'receber' THEN contas.valor ELSE 0 END) AS entradas,

SUM(CASE WHEN contas.valor <> '' AND contas.tipo = 'pagar' THEN contas.valor ELSE 0 END) AS saidas,

SUM(CASE WHEN contas.valor <> '' AND contas.tipo = 'pagar' THEN (-1 * contas.valor) ELSE contas.valor END) AS total

....

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.