2011-02-08 4 views
0

Je veux compter le nombre total de commandes où la tâche est 1 à 3. Ensuite, si entrée1 est déjà compté, j'ai besoin de vérifier si le statut est en cours (tous les statuts qui ne sont pas terminés) . Je dois utiliser un CASE imbriqué ici Je ne veux pas l'inclure dans ma clause WHERE parce que je vais rejoindre plus de tables plus tard.Case imbriquée dans MySQL requête

Ceci est mon exemple de table:

ID + orderid + task + status 
1 | 1  | 1  | Completed 
2 | 2  | 1  | Saved 
3 | 3  | 1  | Saved 
4 | 1  | 2  | Completed 
5 | 1  | 3  | Completed 

Comme vous pouvez le voir dans le domaine des tâches qui ont Entrée1 le total de est 2 et achevé en cours est 1. Lorsque j'exécute ma requête que je reçois des résultats de 2 quand j'ai utilisé entry1 et le statut n'est pas sauvegardé mais j'obtiens aussi le résultat de 2 en enlevant le NOT. Mais quand j'ai utilisé ('COMPLETED'), j'obtiens le bon résultat. Alors, quel est le problème avec ('SAVED') dans mon code. J'espère que je n'ai rien tapé dans ma question.

Ceci est mon exemple de requête:

SELECT 
    COUNT(
     CASE task 
      WHEN 1 THEN task ELSE NULL 
     END 
     AND 
     CASE `status` 
      WHEN NOT UPPER('SAVED') THEN `status` ELSE NULL 
     END 
     ) e1_inprogress 
    FROM tableName; 

Pour l'instant, je viens d'utiliser seule tâche 1, mais dans mon code réel Je dois aussi inclure toutes les tâches et tout statut COUNT. Je pense que c'est simple peut-être que je manque quelque chose alors s'il vous plaît corrigez-moi. Si vous avez un autre moyen s'il vous plaît laissez-nous savoir.

Répondre

1

Utilisez cette

SELECT 
    COUNT(
     CASE WHEN task = 1 AND Upper(`status`) = 'SAVED' THEN 1 END 
     ) e1_inprogress 
    FROM tableName; 


Pourquoi ça n'a pas marché?

WHEN NOT UPPER('SAVED') 

NOT UPPER('SAVED') devient NOT (TRUE) devient FALSE, de sorte que vous comparez CASE Status contre la valeur FALSE.

Votre requête aurait pu être

CASE Upper(`Status`) 
WHEN 'SAVED' THEN ... ELSE ... 

(nb: échange le code THEN et ELSE)

+0

Je reçois maintenant .. Le problème est ma façon de penser de ne pas égale que je devrais utiliser < > ou! = au lieu de NOT ou <=>. Avec votre explication, je considérerai ceci comme ma réponse acceptée et avec votre code, je l'utiliserai à la place du mien pour raccourcir ma requête. Merci encore (je devrais d'abord étudier la base) – ace

Questions connexes