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

Subselect com count()


flinkas

Pergunta

Galera, to precisando de uma query aqui e tá muito dificil. (To usando a versao 5.0.1

A ideia é pegar os valores diferentes de um mesmo campo.

SELECT
  count(cases.id) AS todas,
  date_format(cases.date_entered, '%d-%m-%Y') As data,
  (SELECT count(cases.id)
   FROM cases, cases_cstm
   WHERE cases.id = cases_cstm.id_c AND
         date_format(cases.date_entered, '%Y-%m-%d') = date_format(cases.data_encerramento, '%Y-%m-%d') AND
         date_format(cases.date_entered, '%Y-%m-%d') >= "2008-03-03" AND
         date_format(cases.date_entered, '%Y-%m-%d') <= "2008-03-10"
   ) As so_encerradas
FROM
  cases
WHERE
  date_format(cases.date_entered, '%Y-%m-%d') >= "2008-03-03" AND
  date_format(cases.date_entered, '%Y-%m-%d') <= "2008-03-10" 
GROUP BY
  data
O problema é q a query calcula direitinho os valores do TODAS, separado por dia, mas o valor de SO_ENCERRADAS, ele soma tudo!!! Olha um exemplo de como fica a saída:
total        disciplina    data               so_encerradas
85    Pessoal    03-03-2008    412
85    Pessoal    04-03-2008    412
O CORRETO SERIA ISSO:
total        disciplina    data               so_encerradas
85    Pessoal    03-03-2008    63
88    Pessoal    04-03-2008    61

porque não está dividindo os itens da subquety por dias tb?

[ ]'s

MArcao

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

1 resposta a esta questão

Posts Recomendados

  • 0

Oi, Marcao!

Tenho algumas ressalvas a fazer sobre seu código.

1 - Não encontrei utilidade para a tabela cases_cstm;

2 - O formato da data do MySQL é aaa-mm-dd e não precisa do uso de Format_date para comparar. O uso de funções do jeito que você fez (date_format(cases.date_entered, '%Y-%m-%d') >= "2008-03-03") não deixa o MySQl usar índices para otimizar a consulta, o que leva sempre a um TABLE SCAN;

3 - Quando você comparar de uma data ou outro valor numerico está entre um valor e outro (inclusive) use o BETWEEN em vez de fazer o que fez aqui:(date_format(cases.date_entered, '%Y-%m-%d') >= "2008-03-03" AND

date_format(cases.date_entered, '%Y-%m-%d') <= "2008-03-10");

4 - Quanto a sua consulta, o simples uso da função IF resolve melhor que a subselect que você usou;

5 - O MySQL não trabalha bem com o tipo de subquery que você usou. Ver manual do MySQL.

6 - Crie indice não único para o atributo date_entered. Aqueles que usarem sua consulta agradecerão muito.

Segue o código:

SELECT COUNT(c.id) AS todas, date_format(c.date_entered, '%d-%m-%Y') As data, 
SUM(IF(c.date_entered = c.data_encerramento, 1 , 0)) as encerradas
FROM cases c
WHERE c.date_entered BETWEEN "2008-03-03" AND "2008-03-10" 
GROUP BY c.date_entered

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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