Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde.
É o seguinte, esse primeiro Select eu estou pegando o valor total de dinheiro recebido e pago no mês de maio em duas tabelas, contas a pagar e contas a receber.
Ele trás esse resultado:
VALORREC VALORPAG ANO MESPAG MESREC
209477,8889 59616,18 2013 5 5
Já o de baixo eu só fiz na tabela de contas a receber para ver o que dava:
VALOR MES ANO
9107,7343 5 2013
Estou tentando encontrar o problema, mas não consigo. Obrigado.
SELECT
SUM(COALESCE(VALOR_LIQUIDO,0)) AS VALORREC,
SUM(COALESCE(VALOR,0)) AS VALORPAG,
YEAR(DATA_PAGAMENTO) AS ANO,
MONTH(DATA_PAGAMENTO) AS MESPAG,
MONTH(DATA_RECEB) AS MESREC
FROM
TBL_CONTAS_RECEBER, TBL_CONTAS_PAGAR
WHERE MONTH(DATA_PAGAMENTO) IN (5)
AND MONTH(DATA_RECEB) IN (5)
AND YEAR(DATA_PAGAMENTO) = 2013
AND YEAR(DATA_RECEB) = 2013
GROUP BY
YEAR(DATA_PAGAMENTO),
MONTH(DATA_PAGAMENTO),
MONTH(DATA_RECEB)
ORDER BY
YEAR(DATA_PAGAMENTO),
MONTH(DATA_PAGAMENTO)
-- Outro
SELECT
SUM(VALOR_LIQUIDO) AS VALOR,
MONTH(DATA_RECEB) AS MES,
YEAR(DATA_RECEB) AS ANO
FROM
TBL_CONTAS_RECEBER
WHERE
MONTH(DATA_RECEB) IN (5)
AND
YEAR(DATA_RECEB) = 2013
GROUP BY
MONTH(DATA_RECEB),
YEAR(DATA_RECEB)
Mas pelas cláusulas Where que eu adicionei é meio que impossível ter um produto cartesiano errado...
Não consigo ver onde está errado.
Tente fazer a 1@ query com select * e sem group by.
Está colocando o mesmo registro 23 vezes ! Por isso o valor tão alto !
Mas não sei o que é ainda.
>
Está colocando o mesmo registro 23 vezes ! Por isso o valor tão alto !
Mas não sei o que é ainda.
Produto cartesiano, cada linha de uma tabela é ligada a cada uma da outra tabela.
==========================
Tente algo ssim :
SELECT *
FROM
(
SELECT
SUM(COALESCE(VALOR_LIQUIDO,0)) AS VALORREC,
MONTH(DATA_RECEB) AS MESREC
FROM
TBL_CONTAS_RECEBER
AND MONTH(DATA_RECEB) IN (5)
AND YEAR(DATA_RECEB) = 2013
GROUP BY
MONTH(DATA_RECEB)
) RECEBER,
(
SELECT
SUM(COALESCE(VALOR,0)) AS VALORPAG,
YEAR(DATA_PAGAMENTO) AS ANO,
MONTH(DATA_PAGAMENTO) AS MESPAG
FROM
TBL_CONTAS_PAGAR
WHERE MONTH(DATA_RECEB) IN (5)
AND YEAR(DATA_RECEB) = 2013
GROUP BY
YEAR(DATA_PAGAMENTO),
MONTH(DATA_PAGAMENTO)
) PAGAR
Não entendi muito bem esse SELECT, mas deu certo quando se está levando em consideração somente UM mês.
Se eu coloca Between 1 and 12... muitas linhas novamente.
se colocar between faca um where
receber.ano = pagar.ano and
receber.mes = pagar.mes
Colocar onde esse Where ?
CREIO SER ISTO
SELECT
SUM(COALESCE(VALOR_LIQUIDO,0)) AS VALORREC,
YEAR(DATA_RECEB) AS MESREC,
MONTH(DATA_RECEB) AS MESREC
FROM
TBL_CONTAS_RECEBER
AND MONTH(DATA_RECEB) IN (5)
AND YEAR(DATA_RECEB) = 2013
GROUP BY
MONTH(DATA_RECEB)
) RECEBER,
(
SELECT
SUM(COALESCE(VALOR,0)) AS VALORPAG,
YEAR(DATA_PAGAMENTO) AS ANOPAG,
MONTH(DATA_PAGAMENTO) AS MESPAG
FROM
TBL_CONTAS_PAGAR
WHERE MONTH(DATA_RECEB) IN (5)
AND YEAR(DATA_RECEB) = 2013
GROUP BY
YEAR(DATA_PAGAMENTO),
MONTH(DATA_PAGAMENTO)
) PAGAR
WHERE RECEBER.ANOREC = PAGAR.ANOPAG AND
RECEBER.MESREC = PAGAR.MEPAG
Ha deu certo. Eu estava colocando nos dois selects...
Explica o porque do PRIMEIRO Select lá em cima.. por favor ?
Thnks, eu sei o que é Produto Cartesiano.
O que eu não entendi é um select SOBRE outros dois.
Bom Dia.
Estou com outra dúvida:
SELECT * FROM(SELECT SUM(COALESCE(VALOR_LIQUIDO,0)) AS VALORREC, CONVERT(VARCHAR, DATA_RECEB, 103) AS DATA_RECEB FROM TBL_CONTAS_RECEBER WHERE DATA_RECEB BETWEEN CONVERT(DATETIME, '01/01/2013', 103) AND CONVERT(DATETIME, '31/05/2013', 103) AND ID_STATUS IN (8) GROUP BY DATA_RECEB) RECEBER, (SELECT SUM(COALESCE(VALOR, 0)) AS VALORPAG, CONVERT(VARCHAR, DATA_PAGAMENTO, 103) AS DATA_PAGAMENTO FROM TBL_CONTAS_PAGAR WHERE DATA_PAGAMENTO BETWEEN CONVERT(DATETIME, '01/01/2013', 103) AND CONVERT(DATETIME, '31/05/2013', 103) AND YEAR(DATA_PAGAMENTO) = 2013 AND STATUS IN (3) GROUP BY DATA_PAGAMENTO) PAGAR WHERE RECEBER.DATA_RECEB = PAGAR.DATA_PAGAMENTO
...a dúvida é ...
Aé... eu digitei, mas acho que esqueci de clicar em Responder.
A dúvida é que como eu estou fazendo o select com intervalo de datas ele está mostrando uma data de pagamento e outra de recebimento, visto que nem sempre existe uma conta paga e recebida na mesma data.
Queria que se não tivesse valor ou conta em um dos dias a coluna mostrasse a data e o valor 0 ou NULL, senão não consigo montar no PHP.
Tente com full join.
Não consegui...
Eu gostaria de algo assim:
DATA | VALOR PAGO | VALOR RECEBIDO
01/05/2013 100,00 0,00
Por exemplo, são tabelas diferentes.
TBL_CONTAS_PAGAR
TBL_CONTAS_RECEBER
E as vezes não tem alguma conta a receber no dia, mas tem a pagar.
E eu gostaria de trazer no mesmo SELECT os 100,00 e o 0,00 respectivamente do Contas a Pagar e a Receber, não consegui fazer com o Full Join.
Obrigado.
Pq eu não sei o que coloco no relacionamento.
FULL JOIN CONTAS_RECEBER CR ON CR.NOME_COLUNA = CP.NOME_COLUNA
union
select 'p' tipo,data,valor
from pagar
union
select 'r' tipo,data,valor
from receber
case
select data,
sum(case when tipo = 'p' then valor else 0 end) pagar,
sum(case when tipo = 'p' then valor else 0 end) receber
from
(select 'p' tipo,data,valor
from pagar
union
select 'r' tipo,data,valor
from receber
) virtual
group by dataEu tentei assim:
SELECT
CONVERT(VARCHAR, DATA_PAGAMENTO,103) AS DATA_PAG,
SUM(VALOR) AS VALORPAG,
CONVERT(VARCHAR, DATA_RECEB,103) AS DATA_RECEB,
SUM(VALOR_LIQUIDO) AS VALORREC
FROM
TBL_CONTAS_PAGAR CP
FULL OUTER JOIN
TBL_CONTAS_RECEBER CR ON CR.DATA_RECEB = CP.DATA_PAGAMENTO AND STATUS IN (3) OR ID_STATUS IN (8)
GROUP BY
DATA_PAGAMENTO,
DATA_RECEB
ORDER BY
DATA_PAGAMENTO
Tente algo como o #18.
Então Motta.
Eu fiz isso, veja:
SELECT DATA_PAGAMENTO,
SUM(CASE WHEN TIPO = 'P' THEN VALOR ELSE 0 END) PAGAR,
SUM(CASE WHEN TIPO = 'R' THEN VALOR ELSE 0 END) RECEBER
FROM
(SELECT 'P' TIPO, DATA_PAGAMENTO, VALOR
FROM TBL_CONTAS_PAGAR
WHERE STATUS IN (3)
AND DATA_PAGAMENTO BETWEEN CONVERT(DATETIME, '01/01/2013', 103) AND CONVERT(DATETIME, '31/05/2013', 103)
UNION
SELECT 'R' TIPO, DATA_RECEB, VALOR_LIQUIDO AS VALOR
FROM TBL_CONTAS_RECEBER
WHERE ID_STATUS IN (8)
AND DATA_RECEB BETWEEN CONVERT(DATETIME, '01/01/2013', 103) AND CONVERT(DATETIME, '31/05/2013', 103)
) VIRTUAL
GROUP BY DATA_PAGAMENTO
ORDER BY DATA_PAGAMENTO DESC
Deu certo até... só estou encanado com um dado aqui que não está somando.
Por exemplo, nessa linha:
O nome da Coluna na tabela Contas a Receber é VALOR_LIQUIDO e não VALOR.
Daí está mostrando 875,00 em vez de 1750,00. Existem duas contas recebidas nesse dia, mas está mostrando uma só por assim dizer. Não está somando.
SUM(CASE WHEN TIPO = 'P' THEN VALOR ELSE 0 END) PAGAR,
SUM(CASE WHEN TIPO = 'R' THEN VALOR ELSE 0 END) RECEBER
Interessante que só acontece com esse valor.
A data tem data e hora ? Ttente um trunc na data
Tem Data e Hora 00:00:00, em todas !
Consegui.
Coloquei UNION 'ALL'
Obrigado Motta.
Solved
Não faria sentido pois o literal do "TIPO" dos 2 select sempre os tormam diferentes.
Mas se funcionou deixa queito !
No 1º se "chama" duas tabelas, se o relacionamento não foi feito corretamente pode haver um produto cartesiano indevido.