Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
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
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
Use o CASE.
Fora este link aqui no fórum mesmo tem outros exemplos.
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?
Faz o case retornando o valor ou 0 e um sum disto, como no exemplo, o resultado fica numa coluna.
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
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
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
....
SELECT contas.
data,SUM(contas.valor) AS entradas,
SUM(contas.valor) AS saidas
FROM
contas
GROUP BY
receber.
dataHEAVING 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...
FROM contas GROUP BY receber.data