Ir para conteúdo

Arquivado

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

Tywin

Dois SELECT's "iguais" apresentado resultados diferentes

Recommended Posts

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

No 1º se "chama" duas tabelas, se o relacionamento não foi feito corretamente pode haver um produto cartesiano indevido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pelas cláusulas Where que eu adicionei é meio que impossível ter um produto cartesiano errado...

 

Não consigo ver onde está errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer a 1@ query com select * e sem group by.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está colocando o mesmo registro 23 vezes ! Por isso o valor tão alto !

 

Mas não sei o que é ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

se colocar between faca um where

 

receber.ano = pagar.ano and

receber.mes = pagar.mes

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ha deu certo. Eu estava colocando nos dois selects...

 

Explica o porque do PRIMEIRO Select lá em cima.. por favor ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 data

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu 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

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.