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 trs tabelas s que a soma fica incorreta:

Segue o cdigo de criao 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 agradeo.

San Roman

[]Por mais distncia que a tecnologia possa encurtar, nada mais prximo do que um abrao.[]
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.

_______________________________________________________________________
Virei Orculo!
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.

No d erro algum, s a soma que no est correta.

San Roman

[]Por mais distncia que a tecnologia possa encurtar, nada mais prximo do que um abrao.[]
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

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


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

SANROMAN
MONGAGUA
Cadast. em:Setembro/2013


Tambm no soma corretamente com CROSS JOIN.

San Roman

[]Por mais distncia que a tecnologia possa encurtar, nada mais prximo do que um abrao.[]
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 sugesto a seguinte, extraia primeiro as informaes 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.

_______________________________________________________________________
Virei Orculo!
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 distncia que a tecnologia possa encurtar, nada mais prximo do que um abrao.[]
J.Pires


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

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Citação:
:
Oi GUIMORAES

Apresenta o seguinte erro:



No adianta copiar e colar o cdigo pronto, para tentar entender o que ele est fazendo e adaptar.
Primeiro, tenta rodar esta sentena 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 sentena que passei, s ir funcionar no dialect 3.

Voc tambm 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 no 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 distncia que a tecnologia possa encurtar, nada mais prximo do que um abrao.[]
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 no 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 sentena 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