Ir para conteúdo

Arquivado

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

otaviinn

Somar uma coluna com junção de tabelas

Recommended Posts

   Boa noite pessoal, tudo bem?

   É o seguinte, estou iniciando na área de SQL (inclusive já peço desculpas pelos possíveis erros) e trabalho montando relatórios para um sistema via SQL.

Estou montando um relatório que envolve algumas tabelas e preciso somar o valor de uma coluna, ocorre que quando uso a função SUM no select com as junções das tabelas ele não me retorna a soma dos valores, se somo sem as junções das tabelas ele me retorna perfeitamente, segue abaixo o script:

 

Script que trás a soma corretamente:

 

SELECT SUM(VALOR)
FROM sophia.MOVFIN 
WHERE VENDA = '14617' AND PARCELA = '2'

Resultado

---------------------------------------
329.0000

(1 linha(s) afetadas)

 

Script onde a soma não funciona corretamente:

                                           
SELECT DISTINCT

T.CODIGO As CODTURMA, 
F.NOME As NOME,
F.CPF As CPF,
T.NOME As TURMA,
S.DESCRICAO As SEGMENTO,
F.CODEXT As RA,
F.OBSERVACOES As OBSERVAÇÃO,
case M.STATUS 
WHEN 0 then 'Ativa'
WHEN 1 then 'Trancada'
WHEN 2 then 'Cancelada'
WHEN 3 then 'Transferida'
WHEN 4 then 'Evadida'
WHEN 5 then 'Concluída' end 
as STATUS,
TAB.DESCRICAO1 As INDICADOPOR,
SUM(MEN.VALOR) As MENSALIDADE

FROM SophiA.TURMAS T

LEFT join sophia.MATRICULA M on M.TURMA_REGULAR = T.CODIGO
LEFT join sophia.FISICA F on F.CODIGO = M.FISICA
LEFT join sophia.DADOSPF DF on DF.FISICA = F.CODIGO
LEFT join sophia.SEGMENTOS S on S.CODIGO = DF.SEGMENTO
LEFT join sophia.TAB_DESCRICAO_DADOS TAB on TAB.FISICA = F.CODIGO
LEFT join sophia.MOVFIN MOV ON MOV.VENDA = M.VENDA and MOV.PARCELA = '2'
LEFT join sophia.MOVFIN MEN ON MEN.TITULO = MOV.TITULO

WHERE T.CODIGO = '2214' 

GROUP BY 
T.CODIGO,
F.NOME,
F.CPF,
T.NOME,
S.DESCRICAO,
F.CODEXT,
F.OBSERVACOES,
M.STATUS, 
TAB.DESCRICAO1,
MEN.VALOR                                                                                                                                                                                                                                                                                                                                                                

   Desta forma, basicamente trás como resultado os três registros (mesma quantidade de registro que existe na tabela para estas condições)  com números bem diferentes do registro real, não consegui associar os números a uma referencia para entender o que ocorre. Talvez algo que seja relevante mencionar é que pode-se conter números negativos nos registros, inclusive nessas colunas deste duas querys existem números negativos. 

 

Agradeço muito a atenção de todos! :) 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 17/11/2017 at 21:40, otaviinn disse:

SELECT --DISTINCT  -->> O GROUP BY Já faz isso

T.CODIGO As CODTURMA, 
F.NOME As NOME,
F.CPF As CPF,
T.NOME As TURMA,
S.DESCRICAO As SEGMENTO,
F.CODEXT As RA,
F.OBSERVACOES As OBSERVAÇÃO,
case M.STATUS 
WHEN 0 then 'Ativa'
WHEN 1 then 'Trancada'
WHEN 2 then 'Cancelada'
WHEN 3 then 'Transferida'
WHEN 4 then 'Evadida'
WHEN 5 then 'Concluída' end 
as STATUS,
TAB.DESCRICAO1 As INDICADOPOR,
SUM(MOV.VALOR) As MENSALIDADE

FROM SophiA.TURMAS T

LEFT join sophia.MATRICULA M on M.TURMA_REGULAR = T.CODIGO
LEFT join sophia.FISICA F on F.CODIGO = M.FISICA
LEFT join sophia.DADOSPF DF on DF.FISICA = F.CODIGO
LEFT join sophia.SEGMENTOS S on S.CODIGO = DF.SEGMENTO
LEFT join sophia.TAB_DESCRICAO_DADOS TAB on TAB.FISICA = F.CODIGO
LEFT join sophia.MOVFIN MOV ON MOV.VENDA = M.VENDA and MOV.PARCELA = '2' and MOV.
--LEFT join sophia.MOVFIN MEN ON MEN.TITULO = MOV.TITULO  -->> Mesma tabela que a MOV

WHERE T.CODIGO = '2214' 

GROUP BY 
T.CODIGO,
F.NOME,
F.CPF,
T.NOME,
S.DESCRICAO,
F.CODEXT,
F.OBSERVACOES,
M.STATUS, 
TAB.DESCRICAO1,
--MEN.VALOR -->> Não se informa o valor somado no GROUP BY 

 

Olá otaviin,

 

Fiz algumas modificações em sua QUERY, verifica se é o que você quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 22/11/2017 at 11:07, Christian Gonçalves disse:

 

Olá otaviin,

 

Fiz algumas modificações em sua QUERY, verifica se é o que você quer.

 

Boa noite Christian, muito obrigado por sua resposta!

 

Na verdade não, o resultado continuo o mesmo (Valores diferentes do esperado)

 

Após conferir novamente junção por junção descobri que o problema estava na tabela TAB_DESCRICAO_DADOS que por padrão sempre terá 10 registros, nulos ou não, então o valor vinha "multiplicado" por 10.

 

A solução foi apontar exatamente qual registro eu previsava, assim a junção dela não vinha com 10 registros e ele me apresentava o calor corretamente.

 

Mais uma vez muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por FabianoSouza
      Preciso corrigir o erro "Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS." da minha consulta.
      SELECT TA.titulo AS 'Trilha' , (SELECT CAST(ROUND((Comportamental * 100.0) / (Comportamental + Técnico), 2) AS DECIMAL(5,1)) AS Comportamental ,CAST(ROUND((Técnico * 100.0) / (Comportamental + Técnico), 2) AS DECIMAL(5,1)) AS Técnico FROM ( SELECT SUM(CASE WHEN dbo.tabB.enfoque = '1' THEN 1 ELSE 0 END) AS Comportamental, SUM(CASE WHEN dbo.tabB.enfoque = '2' THEN 1 ELSE 0 END) AS Técnico, COUNT(*) AS Total FROM dbo.tabB ) tab ) FROM dbo.tabA AS TA Nessa consulta, preciso trazer o título (da tabA) e o resultado de um cálculo feito na subconsulta, nos campos Comportamental e Técnico.
    • Por nascimnbeni80@gmail.com
      Caros amigos preciso somar campos de varias tabelas (15 no total), nos quais eu quero somar somente os campos iguais nas data específicas abaixo segue um exemplo.
      OBS: precisa ser sempre o ultimo registro de cada tabela, então considere usar LIMIT 1 e ORDER BY id DESC
       

    • Por FabianoSouza
      Tenho a tabela VAGAS e a tab INSCRITOS.
       
      Preciso fazer um SELECT para retornar as Vagas e a quantidade de candidatos inscritos para cada VAGA.
       
      Fazendo isso retorna duplicidade de Vagas... :-(
       
      select V.empresa, COunt(CIV.cdVaga) AS insc from dbo.vagas AS V LEFT JOIN dbo.inscVaga AS CIV ON V.codigo = CIV.cdVaga GROUP BY V.codigo, V.empresa Como monto essa consulta??
    • Por thiago_tw
      eu to com uma tarefa que preciso de ajuda, já tentei alguns algoritmos que achei por aqui mas nunca dá certo, mandei a imagem do que é para ser feito, agradecido se me ajudarem

    • Por Omar~
      Estou com a tarefa de elaborar uma leitura no banco de dados e não estou conseguindo achar uma solução para a instrução de leitura.
      Basicamente tenho uma tabela que de produtos, nela tenho uma coluna para registrar o vendedor e outra para registrar o comprador assim associar esses valores com a tabela de usuários.
      Digamos assim:
      SELECT produto.id, produto.vendedor, produto.comprador, usuarios.id, usuarios.nome FROM produto INNER JOIN usuarios ON produto.vendedor = usuarios.id Com isso tenho a informação do vendedor na tabela de usuários, mas como faria para obter os dados do comprador também?
       
      Uma forma seria executar dois joins na tabela de usuários porém acho que assim me parece mais gabiarra do que o jeito mais coeso de se fazer  (e na verdade foi gabiarra sim porque não sei como proceder)
      Tipo assim:
      SELECT produto.id, produto.vendedor, produto.comprador, a.id AS a_id, a.nome AS a_nome, b.id AS b_id, b.nome AS b_nome FROM produto INNER JOIN usuarios AS a ON produto.vendedor = a.id INNER JOIN usuarios AS b ON produto.comprador = b.id Tem outro jeito? Como?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.