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

(Resolvido)Filtro no MySql por ano


João Paulo Taraciuk

Pergunta

Olá pessoal, estou tentando fazer um relatório na tabela de vendas onde tenho que separar por mês a pesquisa, o problema é que também tenho que filtrar por ano, e por ano ele não está dando certo, olha o código como está

'select id_pedido, vd_data, vendedor, forma_pagto,  nome_vendedor, total from vendas, vendedores, items_vendas WHERE Extract(Year from vd_data) = :ano and vendas.vd_id_vendedor=vendedores.id_vendedor and extract(month from vd_data) :mes and items_vendas.id_pedido=vendas.vd_id_pedido '
ZQuery_select.ParamByName('ano').AsInteger:=StrToInt(Edit1.text);
ZQuery_select.ParamByName('mes').AsInteger:=StrToInt(ComboBox1.text);

Seleciona por mês certinho, mas por ano não funciona, vocês podem me dizer o que eu estou fazendo errado ?

E aproveitando, como eu poderia separar no QReport o resultado por mes, O que eu devo colocar no TQRGroup, qualquer dica eu agradeço.

Valeu!!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Sugestão: quando filtrar por mês, utilize o between e passe o primeiro dia do mês e o último (faça uso de EndOfTheMonth - DateUtil no Delphi7):

select id_pedido, vd_data, vendedor, forma_pagto,  nome_vendedor, total 
from vendas, vendedores, items_vendas 
WHERE vd_data between (:inicio_mes and :fim_mes)
  and vendas.vd_id_vendedor=vendedores.id_vendedor 
  and items_vendas.id_pedido=vendas.vd_id_pedido
ORDER BY vd_data
observe a ordenação pela data no código:
ZQuery_select.ParamByName('inicio_mes').AsDateTime := EncodeDate(StrToInt(ComboBox1.text), StrToInt(Edit1.text), 1);
ZQuery_select.ParamByName('fim_mes').AsDateTime := EndOfTheMonth(ZQuery_select.ParamByName('inicio_mes').AsDateTime);
E aproveitando, como eu poderia separar no QReport o resultado por mes, O que eu devo colocar no TQRGroup, qualquer dica eu agradeço.
No quick, você precisaria ter o campo referente ao mês para fazer esta quebra (coloca no Expression do QRGroup o campo). Assim, seria conveniente adicionar esta coluna a sua consulta.
select extract(month from vd_data) AS mes_venda id_pedido, vd_data, vendedor, forma_pagto,  nome_vendedor, total 
from vendas, vendedores, items_vendas
...

algo assim.

Mas, se sua consulta filtra apenas 1 mês, porque fazer a quebra por mês? :blink:

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Vou aproveitar este tópico para dar um pitaco na otimização de consultas do MySQL.

Quando tratarem com parte de datas na cláusula WHERE evitem usar funções de conversão no lado esquerdo da pesquisa (o lado onde fica o campo). O uso de funções obriga o MySQL a abandonar qualquer tipo de busca com o auxílio de índices, obrigando-o a realizar um TABLE SCAN, varrendo registro por registro da tabela do começo ao fim da mesma.

O caso em que o Micheus mencionou exemplifica corretamente esta ação.

Sugestão: quando filtrar por mês, utilize o between e passe o primeiro dia do mês e o último (faça uso de EndOfTheMonth - DateUtil no Delphi7):

select id_pedido, vd_data, vendedor, forma_pagto,  nome_vendedor, total 
from vendas, vendedores, items_vendas 
WHERE vd_data between (:inicio_mes and :fim_mes)
  and vendas.vd_id_vendedor=vendedores.id_vendedor 
  and items_vendas.id_pedido=vendas.vd_id_pedido
ORDER BY vd_data

observe a ordenação pela data

Se a pesquisa é constante, então seria melhor criar um índice para vd_data. Pois na pesquisa este irá direto até a primeira ocorrência de vd_data = :inicio_mes e parará a consulta imediatamente quando encontrar a última ocorrência de

vd_data = :fim_mes além de evitar o retrabalho de ordenação de vd_data.

Não esqueça, também, de criar índices para vendedores.id_vendedor, vendas.vd_id_vendedor, items_vendas.id_pedido e vendas.vd_id_pedido; Que evitará a pesquisa recursiva com TABLE SCAN para cada registro de cada tabela.

Nota: Isto também vale para qualquer tipo de banco de dados

Um Abraço.

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...