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.010Query 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.nuIndiceArquitetoresultado errado
nuorcamento vlTotal nuIndiceGerente nuIndiceVendedor nuIndiceArquiteto custoFinanceiro VlRecebimento FornecedorDespesaExtra
000004 12 200.00 0.010 0.010 0.010 10.400 389.600 200.000Resultado 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.000Onde 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
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
GOSET QUOTED_IDENTIFIER ON
GOCREATE 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]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlTotalTabela] DEFAULT ((0)) FOR [vlTotalTabela]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlPDiferenca] DEFAULT ((0)) FOR [vlPDiferenca]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlRealDiferenca] DEFAULT ((0)) FOR [vlRealDiferenca]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlPercentualDesconto] DEFAULT ((0)) FOR [vlPercentualDesconto]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlDesconto] DEFAULT ((0)) FOR [vlDesconto]
GOALTER TABLE [orcanew].[orcamento] ADD CONSTRAINT [DF_orcamento_vlSubTotal] DEFAULT ((0)) FOR [vlSubTotal]
GOALTER 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
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE 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
GOSET QUOTED_IDENTIFIER ON
GOCREATE 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]
GOALTER TABLE [orcanew].[receita] ADD CONSTRAINT [DF_receita_vlDescontoCliente] DEFAULT ((0)) FOR [vlDescontoCliente]
GOALTER TABLE [orcanew].[receita] ADD CONSTRAINT [DF_receita_vlAcrescimoCliente] DEFAULT ((0)) FOR [vlAcrescimoCliente]
GOALTER 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
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

