Ir para conteúdo
medice99

select mais de uma vez a mesma coluna firebird

Recommended Posts

Bom dia  a todos,

 

tenho uma tabela no BD firebird chamada NFITEM que possui todos os itens das notas fiscais emitidas.

Aqui nosso sistema é multiempresas, portanto tem 2 empresas cadastradas na mesma tabela...

Preciso buscar um select, onde me mostre a seguinte ordem:

NOME_PRODUTO, QUANTIDADE_VENDIDA_EMPRESA_1, QUANTIDADE_VENDIDA_EMPRESA_2

 

E ai a partir desse select eu subo para um sistema de relatórios e trabalho as informações...

 

Eu consegui fazer da seguinte forma:

SELECT DES_ITEM,
(SELECT SUM(QTD_EXPEDIDA) EMPRESA1
FROM NFITEM A 
WHERE COD_EMPRESA = 'EMPRESA1' AND A.DES_ITEM = C.DES_ITEM 
AND DAT_IMPRESSAO BETWEEN '01.02.2018' AND '23.02.2018'  
AND COD_TPMATERIAL = 'PA'
AND COD_ITEM < '020000'
GROUP BY DES_ITEM),
(SELECT SUM(QTD_EXPEDIDA) EMPRESA2
FROM NFITEM B 
WHERE COD_EMPRESA = 'EMPRESA2' AND B.DES_ITEM = C.DES_ITEM 
AND DAT_IMPRESSAO BETWEEN '01.02.2018' AND '23.02.2018' 
AND COD_TPMATERIAL = 'PA'
AND COD_ITEM < '020000'
GROUP BY DES_ITEM)
FROM NFITEM C
WHERE COD_TPMATERIAL = 'PA'
AND DAT_IMPRESSAO BETWEEN '01.02.2018' AND '23.02.2018'
AND COD_ITEM < '020000'
GROUP BY DES_ITEM

 

Essa forma me atenderia (em partes), porém pelo fato dessa tabela possuir muitas linhas (mais de 170 mil) a pesquisa acaba demorando demais, as vezes da até 5 minutos para buscar a informação.

Alguém tem alguma ideia de como eu posso melhorar esse select para melhorar a performance?

 

Obrigado desde já.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Union não atenderia pois ele iria colocar a informação ordenada, algo como:
 

NOME_PRODUTO, QUANTIDADE_VENDIDA_EMPRESA_1

NOME_PRODUTO, QUANTIDADE_VENDIDA_EMPRESA_2

 

eu gostaria que ele agrupasse o nome do produto, mas na 2ª coluna a quantidade da empresa 1 e na 3ª coluna quantidade 2

 

Essa tabela tem 3 indices...

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim fica mais rápido:

SELECT DES_ITEM, SUM(IF(COD_EMPRESA = 'XXX', 1, 0)) AS qtd_empresa_1, SUM(IF(COD_EMPRESA = 'YYY', 1, 0)) AS qtd_empresa_2,  
FROM NFITEM
WHERE COD_EMPRESA = IN('XXX', 'YYY')
GROUP BY DES_ITEM

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por eduardohaag
      Boa noite pessoal,
      Esbarrei em um novo problema com consultas no meu sistema.
       
      Tenho um formulário no sistema que deverá apresentar todos os materiais utilizados em uma determinada Venda e seus respectivos estoques obtidos através da soma das entradas e saidas do estoque.
      Para isso devo buscar os dados em 3 tabelas do banco de dados sendo elas VendasProdutos, Composicao,  Materiais e Estoque

       
      Eis que surge meu problema, como posso ter vários produtos na venda e alguns produtos usam os mesmos materiais, a consulta está retornando com os materiais duplicados, quando o que eu gostaria era que somasse de acordo com cada material.
       
      A query que estou usando para teste no acesso é a seguinte:
      SELECT Composicao.IdMaterial, materiais.descricao, Sum(Estoque.Quantidade) AS Estoque, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade] AS TotalUtilizado FROM (VendasProdutos LEFT JOIN (materiais RIGHT JOIN Composicao ON materiais.ID = Composicao.IdMaterial) ON VendasProdutos.IdProduto = Composicao.IdProduto) LEFT JOIN Estoque ON materiais.ID = Estoque.IdMaterial GROUP BY Composicao.IdMaterial, materiais.descricao, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade], VendasProdutos.IdVenda HAVING (((VendasProdutos.IdVenda)=1));  
      A consulta está retornando os dados dessa forma:

       
      E eu gostaria de que agrupasse por ex:
       
      ID                Descricao                Estoque               TotalUtilizado
      1                 Capa Agenda             34                             10
      2                 Miolo Agenda            27                              5
       
      Alguem Sabe como posso fazer isso?
      Desulpem pelo post gigante, mas não sabia como explicar melhor.
    • Por Flávio Marquim
      Meu notebook demora vários minutos para inicializar e durante o uso os navegadores também apresentam lentidão excessiva. Peço ajuda para solucionar.
       
      Seguem abaixo os logs para análise.
       
      Obrigado
       
       https://www.cjoint.com/c/IBguDIwjcgw
       
      https://www.cjoint.com/c/IBguELHUJZw
       
       
       
       
    • Por felipotrindade
      Galera boa noite! Preciso de uma ajuda de vocês com relação a um comando SQL no MySQL e depois no PHP.
      Tenho as seguintes tabelas e as suas colunas:
      Pessoa
       ID
       Nome
       
      Tratamento
       ID
       DESCRICAO
       
      ROTINAS
       ID
       ID_PESSOA
       ID_TRATAMENTO
       
      Por exemplo, quando eu insiro os registros nessas tabelas, onde, a rotina manterá o relacionamento entre pessoa e tratamento conforme abaixo:
      ROTINAS
      ID = 1 ID_PESSOA = 1 ID_TRATAMENTO = 1
      ID = 2 ID_PESSOA = 1 ID_TRATAMENTO = 2
       
      Supondo que, a pessoa se chame JOÃO, ou seja, ele aparece duas vezes na tabela rotinas conforme acima e, o tratamento 1 seja medição do nível de ph e o tratamento 2 seja temperatura da água. Usando o inner join fica assim:
      PESSOA TRATAMENTO.DESCRICAO
      JOÃO      MEDIÇÃO PH
      JOÃO      TEMPERATURA
       
      mysql> select pessoa.nome, tratamento.descricao from rotinas inner join pessoa on rotinas.id_pessoa=pessoa.id inner join tratamento on rotinas.id_tratamento=tratamento.id;
       
      Até ai tudo bem!!! Porém, ao invés de mostrar o comando select com os resultados linhas por linha, gostaria de agrupar pelo nome da pessoa e mostrar os tratamentos, no caso a descrição e colunas e não linha a linha repetindo o nome da pessoa várias vezes.
       
      Não sei se deu para entender! Peço desculpas por tentar explicar dessa forma rs.....
       
      Obrigado se puderem me ajudar!!!
    • Por Félix Henrique
      Boa noite nobres amigos.

      Estou com um problema em meu sisteminha, e não estou sabendo como resolver.

      Segue o link do sistema em funcionamento:
       
      http://locarweb.com.br/cotacao/

      O que eu queria?
      Que ao selecionar um tipo de sementes no 1º select, ele me desse as variedades de sementes disponíveis para esse tipo no 2º select.
      Seria estilo aqueles scripts de Estado/Cidade.

      Mas o que acontece?

      O problema maior ocorre quando vou duplicar a linha de pedidos, duplicando os selects acima.

      O erro acontece que você seleciona um tipo, mas fica disponível todas as variedades no próximo select.

      Seria tipo:
      TIPO ------------- > VARIEDADE
      Brachiara ------ > Decumbens
      Brachiara ------ > Brizantha

      Panicum ------ > Tanzânia
       
       
      Alguém poderia me ajudar a entender como faço para resolver esse problema?
       
    • Por Wictor Pamplona
      Olá, me chamo Wictor Pamplona e estou enfrentando um pequeno problema com HTML. Gostaria de pedir à ajuda de vocês para resolver essa questão.
       
      Veja, eu tenho um formulário aonde possuí vários SELECT, eu já produzi um código jQuery que faz a tradução deste select para HTML e altera o select ele estando oculto para o usuário, isto já está funcional. Porém, recentemente me surgiu a necessidade de inserir código HTML nestes options, tanto para ser imprimido como texto, como ser lido como html dentro da página.
      Sei que a dúvida parecer ser de javascript, porém não é (creio que possa ser resolvido com HTML).
       
      Vejamos, eu colocando o option assim:

      <option value=""><b>1-</b> Linha 1
      Eu queria que fosse traduzido para o select exatamente como foi escrito, sendo uma variável de texto não aplicando a estilização HTML: <b>1- Linha 1</b>.
      Porém, ainda assim apresenta só o texto sem o html, retornando no select apenas: 1- LInha 1, não imprimindo o html em texto.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.