Autor Tópico: Ajuda em Select  (Lida 3262 vezes)

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Ajuda em Select
« Online: Outubro 06, 2010, 12:39:48 pm »
Galera,

Tenho a seguinte tabela passageiros:

Id
Data
Hora (Segundos)
Motorista
NumeroCartao
Aplicacao
AplicacaoEmissor

Preciso fazer um select onde a Quantidade de utilização do Cartão com o mesmo motorista seja Maior que 3 vezes.

Fiz o seguinte select:
Código: [Selecionar]
SELECT
COUNT(*) AS Quantidade,
g.Id,
g.Data,
gp.Data,
sec_to_time(g.Hora) AS HORARIO,
g.NumeroCartao,
gp.NumeroCartao,
g.Motorista,
gp.Motorista
FROM
passageiros p, passageiros gp
WHERE
g.Data Between '2009-09-01' AND '2009-09-01' AND
gp.Data Between '2009-09-01' AND '2009-09-01' AND
g.NumeroCartao = gp.NumeroCartao AND
g.Motorista = gp.Motorista
GROUP BY g.NumeroCartao HAVING Quantidade > 3

Além da query está lenta está duplicando os resultados..

Alguém sabe como me ajudar???

Diogo Toscano

  • Administrator
  • Expert
  • *****
  • Mensagens: 590
    • :: ScriptCase ::
    • Email
Re: Ajuda em Select
« Responder #1 Online: Outubro 06, 2010, 03:02:37 pm »

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #2 Online: Outubro 06, 2010, 03:38:54 pm »

Marco Sabo

  • Iniciante
  • **
  • Mensagens: 76
Re: Ajuda em Select
« Responder #3 Online: Outubro 06, 2010, 11:15:28 pm »
"FROM
passageiros p, passageiros gp"

Não seria "g"

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #4 Online: Outubro 07, 2010, 09:05:19 am »
"FROM
passageiros p, passageiros gp"

Não seria "g"

Marco,

Errei na hora de escrever aqui no forum mas no amiente de produção está correto... Valeu pela dica...

belgadata

  • Intermediário
  • ***
  • Mensagens: 187
    • Email
Re: Ajuda em Select
« Responder #5 Online: Outubro 07, 2010, 12:27:17 pm »
SELECT
COUNT(*) AS Quantidade,
g.Id,
g.Data,
gp.Data,
sec_to_time(g.Hora) AS HORARIO,
g.NumeroCartao,
gp.NumeroCartao,
g.Motorista,
gp.Motorista
FROM
passageiros p, passageiros gp
WHERE
g.Data Between '2009-09-01' AND '2009-09-01' AND
gp.Data Between '2009-09-01' AND '2009-09-01' AND
g.NumeroCartao = gp.NumeroCartao AND
g.Motorista = gp.Motorista
GROUP BY g.NumeroCartao HAVING Quantidade > 3

Bom dia, Leandro
     1 - Os registros estão duplicando porque voce usou a mesma tabela no FROM
          " FROM passageiros p, passageiros gp ". Porque ?
     2- O campos do WHERE devem ter indices e do GROUP BY para melhorar a performance.
          Utilizar "Between " tambem degrada a performance, use "g.Data > '2009-09-01' AND g.Data <  '2009-09-01' ". Se for a mesma data , como exemplo acima, use 'g.data='2009-09-01' "
     3 - os campo do SELECT devem ser os mesmos do GROUP BY e mais os de totalização/agregacao (SUM,COUNT ...)

Abraços !

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #6 Online: Outubro 08, 2010, 08:38:48 am »
Belgadata,

Obrigado pelas dicas, mas não estou conseguindo ver uma forma de fazer esse select...
Tenho que fazer o select onde so me mostre os Cartões que foram utilizados mais de 3 vezes com o mesmo motorista num determinado dia.

Eexemplo:
Id          Data                 Horario            Cartao             Motorista             
1           01/09/2010        07:12              12345678         123123
2           01/09/2010        07:45              12345678         100100
3           01/09/2010        09:00              12345678         100100
4           01/09/2010        11:12              12345678         100100
5           01/09/2010        15:12              12345678         100100
6           01/09/2010        18:12              12345678         123456

belgadata

  • Intermediário
  • ***
  • Mensagens: 187
    • Email
Re: Ajuda em Select
« Responder #7 Online: Outubro 08, 2010, 12:03:13 pm »
Ok, amigo execute a query
SELECT Motorista,NumeroCartao, count(*) as Quantidade

FROM passageiros

WHERE Data = '2009-01-01'

ORDER BY Motorista,NumeroCartao

GROUP BY Motorista,NumeroCartao

HAVING count(*) > 3

Diogo Toscano

  • Administrator
  • Expert
  • *****
  • Mensagens: 590
    • :: ScriptCase ::
    • Email
Re: Ajuda em Select
« Responder #8 Online: Outubro 08, 2010, 12:23:18 pm »
foi por isso q coloquei o link de group by e having ...

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #9 Online: Outubro 08, 2010, 04:23:39 pm »
Ok, amigo execute a query
SELECT Motorista,NumeroCartao, count(*) as Quantidade

FROM passageiros

WHERE Data = '2009-01-01'

ORDER BY Motorista,NumeroCartao

GROUP BY Motorista,NumeroCartao

HAVING count(*) > 3

Vou testar e informo o resultado...

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #10 Online: Outubro 08, 2010, 04:24:21 pm »
foi por isso q coloquei o link de group by e having ...

Entendi, tava criando uma query complicada para uma coisa simples...

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select
« Responder #11 Online: Outubro 08, 2010, 10:21:19 pm »
Ok, amigo execute a query
SELECT Motorista,NumeroCartao, count(*) as Quantidade

FROM passageiros

WHERE Data = '2009-01-01'

ORDER BY Motorista,NumeroCartao

GROUP BY Motorista,NumeroCartao

HAVING count(*) > 3

Belgadata / Diogo

Funcionou perfeitamente... Obrigado

rayfcrols

  • Intermediário
  • ***
  • Mensagens: 193
Ajuda em Select - Nova pergunta
« Responder #12 Online: Dezembro 03, 2010, 10:42:37 am »
Pessoal eu estou com um problema que não consigo resolver tenho que montar uma consulta em que somente liste os itens que se encontram em uma outra tabela. Vou tentar explicar:

TABELA1
   cod_doc, titulo_cod,  descricao_doc
      1         Titulo1       Descrição1
      2         Titulo2       Descrição2
      3         Titulo3       Descrição3
      4         Titulo4       Descrição4
      5         Titulo5       Descrição5

TABELA2
   cod_mov, cod_doc,  status_mov
      1         1              OK
      1         3              FALTA
      1         5              OK

Basicamente eu quero dar um select que liste somente os itens que constam na TABELA2 e que o cod_mov seja "tal"...

leandroauler

  • Avançado
  • ****
  • Mensagens: 381
Re: Ajuda em Select - Nova pergunta
« Responder #13 Online: Dezembro 06, 2010, 02:08:13 pm »
Pessoal eu estou com um problema que não consigo resolver tenho que montar uma consulta em que somente liste os itens que se encontram em uma outra tabela. Vou tentar explicar:

TABELA1
   cod_doc, titulo_cod,  descricao_doc
      1         Titulo1       Descrição1
      2         Titulo2       Descrição2
      3         Titulo3       Descrição3
      4         Titulo4       Descrição4
      5         Titulo5       Descrição5

TABELA2
   cod_mov, cod_doc,  status_mov
      1         1              OK
      1         3              FALTA
      1         5              OK

Basicamente eu quero dar um select que liste somente os itens que constam na TABELA2 e que o cod_mov seja "tal"...
Ray

Código: [Selecionar]
select t1.cod_doc, t1.titulo_cod,  t1.descricao_doc FROM tabela1 t1 WHERE cod_doc EXISTS (Select * FROM tabela2 where cod_doc = t1.cod_doc)

Haroldo

  • Expert
  • *****
  • Mensagens: 6286
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re: Ajuda em Select
« Responder #14 Online: Dezembro 06, 2010, 03:17:34 pm »
select campos from tabela in where campo in (select campo from tabela2 where condição)