INNER JOIN COM 3 TABELAS E SOMA DE CAMPOS

 Tópico anterior Próximo tópico Novo tópico

INNER JOIN COM 3 TABELAS E SOMA DE CAMPOS

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#481449 - 04/05/2018 12:20:59

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


Boa tarde,

Criei um datagridview com os valores de três tabelas só que a soma fica incorreta:

Segue o código de criação do datagridview:
  Try
                Using strCom As FbCommand = New FbCommand("SELECT a.Conta, SUM(b.Valor), SUM(c.Valor) " & _
                                                          "FROM tbConta as a " & _
                                                          "INNER JOIN tbReceita as b ON b.Login = a.Login " & _
                                                          "INNER JOIN tbDespesa as c ON c.Login = a.Login " & _
                                                          "WHERE EXTRACT(MONTH FROM b.DataMovimento) = @mes " & _
                                                          "AND EXTRACT(YEAR FROM b.DataMovimento) = @ano " & _
                                                          "AND a.Titular = @titular " & _
                                                          "AND a.Login = @login " & _
                                                          "GROUP BY a.Conta", con)

                    strCom.Parameters.AddWithValue("@mes", frmPrincipal.txtMesRef.Text)
                    strCom.Parameters.AddWithValue("@ano", frmPrincipal.txtAnoRef.Text)
                    strCom.Parameters.AddWithValue("@titular", frmLogin.txtNome.Text)
                    strCom.Parameters.AddWithValue("@login", frmLogin.cbNome.Text)

                    Using da As FbDataAdapter = New FbDataAdapter(strCom)

                        Dim dt As DataTable = New DataTable("Receita")
                        Dim ds As DataSet = New DataSet

                        dgvTotalConta.Columns.Clear()
                        da.Fill(ds)

                        With dgvTotalConta

                            .DefaultCellStyle.Font = New Font("Arial", 8, FontStyle.Regular)
                            .ColumnHeadersDefaultCellStyle.Font = New Font("Arial", 8, FontStyle.Regular)
                            .GridColor = Color.LightGray
                            .BorderStyle = BorderStyle.Fixed3D
                            .RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
                            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
                            .RowHeadersVisible = False
                            .BackgroundColor = Color.White
                            .ColumnCount = 4
                            .AutoGenerateColumns = False
                            .Columns(0).Name = "Conta"
                            .Columns(1).Name = "Receita"
                            .Columns(2).Name = "Despesa"
                            .Columns(0).Width = 120
                            .Columns(1).Width = 100
                            .Columns(2).Width = 100
                            .Columns(1).DefaultCellStyle.Format = "N"
                            .Columns(2).DefaultCellStyle.Format = "N"
                            .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
                            .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                            .Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                            .AllowUserToAddRows = False
                            .AllowUserToDeleteRows = False
                            .AllowUserToOrderColumns = False
                            .AllowUserToResizeColumns = False
                            .AllowUserToResizeRows = False

                        End With

                        dt = ds.Tables(0)

                        For Each linha As DataRow In dt.Rows
                            dgvTotalConta.Rows.Add(linha(0), linha(1), linha(2))
                        Next

                    End Using
                End Using

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try


Se puderem me ajudar, a achar o motivo de soma errada, desde já agradeço.

San Roman

"Por mais distância que a tecnologia possa encurtar, nada é mais próximo do que um abraço."
J.Pires


#481450 - 04/05/2018 12:52:17

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Use LEFT JOIN e veja se o resultado fica correto.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#481451 - 04/05/2018 13:02:16

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


KERPLUNK,

Exibe os mesmos valores com o uso de INNER JOIN ou LEFT JOIN.

Não dá erro algum, só a soma que não está correta.

San Roman

"Por mais distância que a tecnologia possa encurtar, nada é mais próximo do que um abraço."
J.Pires


#481452 - 04/05/2018 13:24:26

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Acho que pra dar o resultado que você quer você vai ter que fazer o join com um produto cartesiano único de despesas e receitas

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#481453 - 04/05/2018 14:58:46

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


Também não soma corretamente com CROSS JOIN.

San Roman

"Por mais distância que a tecnologia possa encurtar, nada é mais próximo do que um abraço."
J.Pires


#481454 - 04/05/2018 15:19:34

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Você está tentando fazer um balancete, com receita e despesas, ou um DRE?

A minha sugestão é a seguinte, extraia primeiro as informações de receita, e depois de despesas, e realize um group com tudo.
Exempo:

  

select conta, sum(receita) as receita, sum(despesas) as despesas
from (

SELECT a.Conta, SUM(b.Valor) as receita, '0' as despesas
FROM tbConta as a
INNER JOIN tbReceita as b ON b.Login = a.Login
WHERE EXTRACT(MONTH FROM b.DataMovimento) = @mes
AND EXTRACT(YEAR FROM b.DataMovimento) = @ano
AND a.Titular = @titular
AND a.Login = @login
GROUP BY a.Conta

Union all

SELECT a.Conta, '0' as receita, SUM(c.Valor) as despesas
FROM tbConta as a
INNER JOIN tbDespesa as c ON c.Login = a.Login
WHERE EXTRACT(MONTH FROM c.DataMovimento) = @mes
AND EXTRACT(YEAR FROM c.DataMovimento) = @ano
AND a.Titular = @titular
AND a.Login = @login
GROUP BY a.Conta
)
group by conta





#481455 - 04/05/2018 15:23:24

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
GUIMORAES, é exatamente o que eu tinha dito: um produto cartesiano de receitas e despesas separado.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#481456 - 04/05/2018 16:15:16

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


 Anexos estao visíveis somente para usuários registrados

Oi GUIMORAES

Apresenta o seguinte erro:



San Roman

"Por mais distância que a tecnologia possa encurtar, nada é mais próximo do que um abraço."
J.Pires


#481457 - 04/05/2018 16:31:28

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Citação:
:
Oi GUIMORAES

Apresenta o seguinte erro:



Não adianta copiar e colar o código pronto, é para tentar entender o que ele está fazendo e adaptar.
Primeiro, tenta rodar esta sentença direto no seu banco de dados, usando o ibexpert por exemplo, e veja o resultado.
Segundo, em qual "Dialect" está seu banco de dados? Para a sentença que passei, só irá funcionar no dialect 3.

Você também pode fazer um cast para solucionar este problema.



#481458 - 04/05/2018 17:15:48

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


 Anexos estao visíveis somente para usuários registrados

Oi GUIMORAES

O firebird está em dialect 3

Rodei o editor do ibexpert: O erro estava nas aspas do valor 0

Retirei as aspas do valor 0 e não deu o erro que te reportei

Só que agora está somando o valor total do campo Valor para todas as Contas conforme arquivo em anexo


San Roman

"Por mais distância que a tecnologia possa encurtar, nada é mais próximo do que um abraço."
J.Pires


#481466 - 05/05/2018 08:59:50

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Citação:
:
Oi GUIMORAES

O firebird está em dialect 3

Rodei o editor do ibexpert: O erro estava nas aspas do valor 0

Retirei as aspas do valor 0 e não deu o erro que te reportei

Só que agora está somando o valor total do campo Valor para todas as Contas conforme arquivo em anexo


Posta aqui a sentença que você está utilizando.



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário