Answered INNER JOIN SUM

  • terça-feira, 6 de março de 2012 23:24
     
     

    Pessoal estou tendo problemas com INNER JOIN na hora de somar valores
    Abaixo colquei todas as querys com os seus resultados para um melhor entendimento.
    Quando junto as tabelas o resultado da errado


    Query individual orcamento
    select ORC.nuorcamento, ORC.vlTotal,ORC.nuIndiceGerente, ORC.nuIndiceVendedor, ORC.nuIndiceArquiteto
    from orcamento ORC  Where ORC.idSituacao = '13' AND ORC.idOrcamento = '284'

    Resultado da tabela orcamento
    nuorcamento vlTotal nuIndiceGerente nuIndiceVendedor nuIndiceArquiteto
    000004 12      200.00      0.010             0.010                 0.010

    Query individual despesas
    select DE.vlNotaFiscal from despesas DE Where DE.idOrcamento = '284'

    Resultado da tabela despesas
    vlNotaFiscal
    60.000
    40.000


     
    Query individual  receita
    select REC.vlTaxa, REC.vlFinal from receita REC Where REC.idOrcamento = '284'
    Resultado receita
    vlTaxa  vlFinal
    4.000   96.000
    1.200   98.800


    Query completa
    select ORC.nuorcamento, ORC.vlTotal,
    ORC.nuIndiceGerente, ORC.nuIndiceVendedor, ORC.nuIndiceArquiteto,
    sum(REC.vlTaxa)AS custoFinanceiro,
    sum(REC.vlFinal)as VlRecebimento,
    sum(DE.vlNotaFiscal) AS FornecedorDespesaExtra
    from orcamento ORC
    INNER JOIN receita REC
    ON ORC.idOrcamento = REC.idOrcamento
    INNER JOIN despesas DE
    ON ORC.idOrcamento = DE.idOrcamento
    Where ORC.idSituacao = '13'
    AND ORC.idOrcamento = '284'
    GROUP BY ORC.nuorcamento, ORC.vlTotal, ORC.nuIndiceGerente, ORC.nuIndiceVendedor, ORC.nuIndiceArquiteto

    resultado errado
    nuorcamento vlTotal nuIndiceGerente nuIndiceVendedor nuIndiceArquiteto custoFinanceiro VlRecebimento FornecedorDespesaExtra
    000004 12    200.00     0.010               0.010                      0.010                       10.400       389.600           200.000

    Resultado certo deveria ser esse e não o de cima
    nuorcamento vlTotal nuIndiceGerente nuIndiceVendedor nuIndiceArquiteto custoFinanceiro VlRecebimento FornecedorDespesaExtra
    000004 12    200.00    0.010                 0.010                  0.010                  5.200               192.800          100.000

    Onde esta o erro?
    Obrigado

Todas as Respostas

  • quarta-feira, 7 de março de 2012 00:30
     
     

    Sacseixas,

    Os registros estão sendo duplicados precisamos saber porque esta duplicando.

    Por favor faça um teste, tire o SUM desses campos e o group by pega o retorno do SELECT  e cole aqui para eu dar uma olhada.

    Obrigado,

    Leandro Rodrigues


    Caso a resposta tenha ajudado, não esqueça de marcar como resposta válida

  • quarta-feira, 7 de março de 2012 12:49
     
     

    Leandro

    A saida é exatamente o que eu coloquei acima. Separado por cada tabela

    Existem varios registros nas tabelas receitas e despesas.

  • quarta-feira, 7 de março de 2012 14:24
     
     Respondido Contém Código

    Bom dia,

    Sacseixas, experimente mais ou menos desta forma:

    select 
        ORC.nuorcamento, 
        ORC.vlTotal, 
        ORC.nuIndiceGerente, 
        ORC.nuIndiceVendedor, 
        ORC.nuIndiceArquiteto, 
        REC.custoFinanceiro,
        REC.VlRecebimento,
        DE.FornecedorDespesaExtra
    from orcamento ORC 
    
    INNER JOIN 
        (select 
             idOrcamento,
             sum(vlTaxa) as custoFinanceiro, 
             sum(vlFinal) as VlRecebimento
         from receita
         where idOrcamento = '284'
         group by idOrcamento) REC
    ON ORC.idOrcamento = REC.idOrcamento
    
    INNER JOIN 
        (select 
             idOrcamento,
             sum(DE.vlNotaFiscal) AS FornecedorDespesaExtra
         from despesas 
         where idOrcamento = '284'
         group by idOrcamento) DE
    ON ORC.idOrcamento = DE.idOrcamento
    
    Where ORC.idSituacao = '13' 
    AND ORC.idOrcamento = '284'
    

    Espero que seja útil.


    Assinatura: Imobiliarias em Suzano

    • Marcado como Resposta sacseixas quarta-feira, 7 de março de 2012 16:27
    •  
  • quarta-feira, 7 de março de 2012 14:49
     
     

    Funcionou

    Agora seria pedir muito uma explicação?

    O porque da difença?

    Obrigado

  • quarta-feira, 7 de março de 2012 18:02
     
     

    Sacseixas,

    Isso que eu chamo de gambiarra monstra, isso tem uma queda de performance na aplicação, se você tiver muitos registro terá sérios problemas, coloque a estrutura da sua tabela, da um CREATE e manda eu analise faço gerar através do SUM não gambiarra e te explico, já até imagina o que seja.

    Não faça gambiarra, por mais que elas te ajudem ...

    Abraços,

    Leandro Rodrigues


    Caso a resposta tenha ajudado, não esqueça de marcar como resposta válida

  • quarta-feira, 7 de março de 2012 18:27
     
     

    Segue 1

    USE [orca]
    GO

    /****** Object:  Table [orcanew].[orcamento]    Script Date: 03/07/2012 15:22:30 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [orcanew].[orcamento](
     [idOrcamento] [int] IDENTITY(1,1) NOT NULL,
     [nuOrcamento] [nvarchar](50) NULL,
     [dsCategoria] [nvarchar](50) NULL,
     [idLoja] [int] NULL,
     [dtData] [nvarchar](50) NULL,
     [dsCliente] [nvarchar](250) NULL,
     [dsCPF] [nvarchar](50) NULL,
     [dsClienteEndereco] [nvarchar](250) NULL,
     [dsClienteTelefone] [nvarchar](100) NULL,
     [dsClienteEmail] [nvarchar](100) NULL,
     [idArquiteto] [int] NULL,
     [dsArquiteto] [nvarchar](150) NULL,
     [dsReferencia] [ntext] NULL,
     [dsTextoApresentacao] [ntext] NULL,
     [dsObservacoes] [ntext] NULL,
     [dsPagamento] [ntext] NULL,
     [dsPrazo] [ntext] NULL,
     [dsValidade] [ntext] NULL,
     [dsRodape] [ntext] NULL,
     [vlCusto] [decimal](18, 2) NULL,
     [vlTotalTabela] [decimal](18, 2) NULL,
     [dsDiferenca] [nvarchar](50) NULL,
     [vlPDiferenca] [decimal](18, 2) NULL,
     [vlRealDiferenca] [decimal](18, 2) NULL,
     [chkDesconto] [nvarchar](50) NULL,
     [vlPercentualDesconto] [decimal](18, 2) NULL,
     [vlDesconto] [decimal](18, 2) NULL,
     [vlSubTotal] [decimal](18, 2) NULL,
     [vlTotal] [decimal](18, 2) NULL,
     [chkVisualiza] [int] NULL,
     [idVendedor] [int] NULL,
     [dtCadastro] [datetime] NULL,
     [nuIndiceGerente] [numeric](18, 3) NULL,
     [nuIndiceVendedor] [numeric](18, 3) NULL,
     [nuIndiceArquiteto] [numeric](18, 3) NULL,
     [idSituacao] [int] NULL,
     [idStatus] [int] NULL,
     CONSTRAINT [PK_orcamento] PRIMARY KEY CLUSTERED
    (
     [idOrcamento] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlCusto]  DEFAULT ((0)) FOR [vlCusto]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlTotalTabela]  DEFAULT ((0)) FOR [vlTotalTabela]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlPDiferenca]  DEFAULT ((0)) FOR [vlPDiferenca]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlRealDiferenca]  DEFAULT ((0)) FOR [vlRealDiferenca]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlPercentualDesconto]  DEFAULT ((0)) FOR [vlPercentualDesconto]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlDesconto]  DEFAULT ((0)) FOR [vlDesconto]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlSubTotal]  DEFAULT ((0)) FOR [vlSubTotal]
    GO

    ALTER TABLE [orcanew].[orcamento] ADD  CONSTRAINT [DF_orcamento_vlTotal]  DEFAULT ((0)) FOR [vlTotal]
    GO

  • quarta-feira, 7 de março de 2012 18:28
     
     

    Segue 2 e 3

    USE [orca]
    GO

    /****** Object:  Table [orcanew].[despesas]    Script Date: 03/07/2012 15:24:22 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [orcanew].[despesas](
     [idDespesa] [int] IDENTITY(1,1) NOT NULL,
     [idOrcamento] [int] NULL,
     [nuOrcamento] [varchar](50) NULL,
     [nuPedido] [varchar](50) NULL,
     [idFornecedor] [int] NULL,
     [idTipoDespesa] [int] NULL,
     [codSetorCP] [int] NULL,
     [dsDescricao] [nvarchar](500) NULL,
     [dtDataDepesa] [datetime] NULL,
     [nuNotaFiscal] [nvarchar](10) NULL,
     [dtDataChegada] [datetime] NULL,
     [dsBanco] [nvarchar](50) NULL,
     [vlValorDespesas] [numeric](18, 3) NULL,
     [vlNotaFiscal] [numeric](18, 3) NULL,
     [codCentroCusto] [int] NULL,
     [idLoja] [int] NULL,
     [idSituacaoDespesas] [int] NULL,
     [nuStatus] [int] NULL,
     CONSTRAINT [PK_despesas] PRIMARY KEY CLUSTERED
    (
     [idDespesa] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    ----------------fim ------------------------

    ------------------inicio ------------------

    USE [orca]
    GO

    /****** Object:  Table [orcanew].[receita]    Script Date: 03/07/2012 15:25:16 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [orcanew].[receita](
     [idReceita] [int] IDENTITY(1,1) NOT NULL,
     [idOrcamento] [int] NULL,
     [dsReceita] [nvarchar](150) NULL,
     [codPagamento] [int] NULL,
     [dtPrevisao] [datetime] NULL,
     [vlValorRecebimento] [numeric](18, 3) NULL,
     [dsBancoCheque] [nvarchar](150) NULL,
     [nuDocumento] [nvarchar](50) NULL,
     [vlTaxa] [numeric](18, 3) NULL,
     [dtDataVencimento] [datetime] NULL,
     [codBandeira] [int] NULL,
     [vlDesconto] [numeric](18, 3) NULL,
     [codRecebimento] [int] NULL,
     [dtRecebimento] [datetime] NULL,
     [vlDocumento] [numeric](18, 3) NULL,
     [vlDescontoCliente] [numeric](18, 3) NULL,
     [vlAcrescimoCliente] [numeric](18, 3) NULL,
     [vlFinal] [numeric](18, 3) NULL,
     [codLocal] [int] NULL,
     [idLoja] [int] NULL,
     [dsObs] [text] NULL,
     [idSituacaoReceita] [int] NULL,
     [nuStatus] [int] NULL,
     CONSTRAINT [PK_receita] PRIMARY KEY CLUSTERED
    (
     [idReceita] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    ALTER TABLE [orcanew].[receita] ADD  CONSTRAINT [DF_receita_vlDocumento]  DEFAULT ((0)) FOR [vlDocumento]
    GO

    ALTER TABLE [orcanew].[receita] ADD  CONSTRAINT [DF_receita_vlDescontoCliente]  DEFAULT ((0)) FOR [vlDescontoCliente]
    GO

    ALTER TABLE [orcanew].[receita] ADD  CONSTRAINT [DF_receita_vlAcrescimoCliente]  DEFAULT ((0)) FOR [vlAcrescimoCliente]
    GO

    ALTER TABLE [orcanew].[receita] ADD  CONSTRAINT [DF_receita_vlFinal]  DEFAULT ((0)) FOR [vlFinal]
    GO

  • quinta-feira, 8 de março de 2012 14:42
     
     

    Bom dia

    Sacseixas, não consegui identificar o problema apontado na instrução SQL que postei, mas de antemão peço desculpas a todos pela sugestão inadequada e solicito que o meu post seja desmarcado como resposta.

    Att


    Assinatura: Imobiliarias em Suzano

  • sábado, 10 de março de 2012 18:53
     
     

    Gapimex

    Não entendi porque desmarcar.

    Funcionou, o Leandro Rodrigues Chamou de gambiara porem não mostrou uma solução.

    Eu queria explicação de porque a sua query funciona e minha não.

  • segunda-feira, 12 de março de 2012 15:11
     
     Respondido Contém Código

    Sacseixas,

    Acredito que o join da sua query gera todas as combinações possíveis entre as linhas das tabelas de despesas e receita.

    Considerando os valores do seu primeiro post teriamos as seguintes combinações:

    vlNotaFiscal   |   vlTaxa   |   vlFinal 

    60.000   |   4.000   |   96.000 

    60.000   |   1.200   |   98.800

    40.000   |   4.000   |   96.000

    40.000   |   1.200   |   98.800

    Somente depois é feita a soma.

    Na query que sugeri, primeiro é feita a soma das linhas das tabelas receita e despesas, cada qual gerando uma tabela derivada com apenas uma linha, para depois fazer o join.

    Também é possível utilizar CTE, que acredito eu seja equivalente a query que sugeri antes.

    Com CTE o que eu disse antes fica mais evidente:

    with 
        CTE_REC (idOrcamento, custoFinanceiro, VlRecebimento) as
            (select 
                 idOrcamento,
                 sum(vlTaxa), 
                 sum(vlFinal)
             from receita
             where idOrcamento = '284'
             group by idOrcamento),
        CTE_DE (idOrcamento, FornecedorDespesaExtra) as
            (select 
                 idOrcamento,
                 sum(DE.vlNotaFiscal)
             from despesas 
             where idOrcamento = '284'
             group by idOrcamento) 
    
    select 
        ORC.nuorcamento, 
        ORC.vlTotal, 
        ORC.nuIndiceGerente, 
        ORC.nuIndiceVendedor, 
        ORC.nuIndiceArquiteto, 
        REC.custoFinanceiro,
        REC.VlRecebimento,
        DE.FornecedorDespesaExtra
    from orcamento ORC 
    
    INNER JOIN CTE_REC REC
    ON ORC.idOrcamento = REC.idOrcamento
    
    INNER JOIN CTE_DE DE
    ON ORC.idOrcamento = DE.idOrcamento
    
    Where ORC.idSituacao = '13' 
    AND ORC.idOrcamento = '284'

    Espero que seja útil.


    Assinatura: Imobiliarias em Suzano

    • Marcado como Resposta sacseixas quarta-feira, 14 de março de 2012 16:47
    •