Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Consulta sql com 3 tabelas


nicolasbraz

Pergunta

Estou precisando fazer uma consulta em 3 tabelas para gerar orçamento, eu preciso que saia assim.

http://imageshack.us/photo/my-images/404/95745624.jpg/

Mas ele está saindo assim.

http://imageshack.us/photo/my-images/829/saindo.jpg/

Como podem ver ele duplica os itens era para mostrar só 1x o item 1.02 e ele mostra 3x.

Se fosse só 2 tabelas eu consigo fazer sair certo só que eu preciso das 3, eu estou usando o seguinte código.

select DISTINCT ORCAPAI_CODIGO ORCAITEM_DESCRICAO, ORCAITEM_ITEM, 
            ORCAITEM_SUBTOTAL, ORCAITEM_CODIGO_ORCA_PAI,

            ORSER_CODIGO_ORCA_PAI, SER_CODIGO, 
            ORSER_ITEM, ORSER_PRECO_MAO_OBRA, 
            ORSER_PRECO_MAO_OBRA_TOTAL, ORSER_PRECO_MATERIAL, 
            ORSER_PRECO_MATERIAL_TOTAL, 
            ORSER_QUANTIDADE,ORSER_UNIDADE,
            ORSER_VALOR_TOTAL 

            from ORCA_SERVICO, ORCA_ITEM, ORCA_PAI

            where ORCAITEM_CODIGO_ORCA_PAI = ORCAPAI_CODIGO and 
            ORSER_CODIGO_ORCA_PAI = ORCAPAI_CODIGO 

            order by orser_item

Editado por nicolasbraz
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Cláusula Distinct no SQL

Após a lista de seleção ser processada, a tabela resultante pode opcionalmente estar sujeita à remoção das linhas duplicadas. A palavra chave DISTINCT deve ser escrita logo após o SELECT para especificar esta funcionalidade

SELECT DISTINCT lista_de_seleção ...

(Em vez de DISTINCT pode ser utilizada a palavra ALL para especificar o comportamento padrão de manter todas as linhas)

Como é óbvio, duas linhas são consideradas distintas quando têm pelo menos uma coluna diferente. Os valores nulos são considerados iguais nesta comparação.

Como alternativa, uma expressão arbitrária pode determinar quais linhas devem ser consideradas distintas:

SELECT DISTINCT ON (expressão [, expressão ...]) lista_de_seleção ...

Neste caso, expressão é uma expressão de valor arbitrária avaliada para todas as linhas. Um conjunto de linhas para as quais todas as expressões são iguais são consideradas duplicadas, e somente a primeira linha do conjunto é mantida na saída.

Deve ser observado que a “primeira linha” de um conjunto é imprevisível, a não ser que a consulta seja ordenada por um número suficiente de colunas para garantir a ordem única das linhas que chegam no filtro DISTINCT (o processamento de DISTINCT ON ocorre após a ordenação do ORDER BY).

A cláusula DISTINCT ON não faz parte do padrão SQL, sendo algumas vezes considerada um estilo ruim devido à natureza potencialmente indeterminada de seus resultados. Utilizando-se adequadamente GROUP BY e subconsultas no FROM esta construção pode ser evitada, mas geralmente é a alternativa mais fácil.

Em Resumo: duas linhas são consideradas distintas quando têm pelo menos uma coluna diferente. Os valores nulos são considerados iguais nesta comparação.

Assim sendo :

select DISTINCT ORCAPAI_CODIGO ORCAITEM_DESCRICAO, ORCAITEM_ITEM, 
            ORCAITEM_SUBTOTAL, ORCAITEM_CODIGO_ORCA_PAI,

            ORSER_CODIGO_ORCA_PAI, SER_CODIGO, 
            ORSER_ITEM, ORSER_PRECO_MAO_OBRA, 
            ORSER_PRECO_MAO_OBRA_TOTAL, ORSER_PRECO_MATERIAL, 
            ORSER_PRECO_MATERIAL_TOTAL, 
            ORSER_QUANTIDADE,ORSER_UNIDADE,
            ORSER_VALOR_TOTAL 

            from ORCA_SERVICO, ORCA_ITEM, ORCA_PAI

            where ORCAITEM_CODIGO_ORCA_PAI = ORCAPAI_CODIGO and 
            ORSER_CODIGO_ORCA_PAI = ORCAPAI_CODIGO 

            order by orser_item

O seu select retorna 3 valores iguais como resultado da união de 3 tabelas, onde pelo menos um dos campos selecionados tem valor diferente

uma maneira de contornar esse problema, seria na hora de montar o relatorio, utilizar a banda GROUP HEADER

colocando na propriedade Expression o campo delimitador ( ex: ORCAITEM_ITEM ) isso faz com que somente o item não duplicado apareça

exemplo

http://limanetoinfo.blogspot.com.br/2009/0...uickreport.html

tutorial em ingles

http://delphi.about.com/library/bluc/text/uc051701f.htm

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eu resolvi tirar o Distinct até porque ele não estava causando mudança alguma em meu SQL, eu entendi o porque o código está duplicando porém eu não consigo enxergar um outro código SQL para resolver o meu problema!

Sobre o QuickReport eu vi os links que você me passou e coloquei o QrExpression como o ORCAITEM_ITEM e também setei a band detail como linkband da GroupHeader.

E agora ele está saindo assim.

http://imageshack.us/photo/my-images/215/relatoriod.jpg/

Ele está reconhecendo o ORCAITEM_ITEM como group header só que ele coloca 1 item por grupo!

Estava pensando se eu não devo criar uma chave estrangeira na tabela de serviço, onde ela reconheceria que se o item que eu estou cadastrando começa com 1 ele preenche o campo com 1.00 sendo assim referente ao item (da tabela de item) 1.00.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      652k
×
×
  • Criar Novo...