2017-04-10 2 views
1

J'essaie de compter le nombre total d'employés dans ma table de sous-requêtes. Supposons que le résultat du comptage renvoie 0, mais qu'il continue à renvoyer 1.COUNT (DISTINCT()) Retourne la valeur false

Si j'essaie de renvoyer uniquement le paramètre employee_id et le mois, je n'ai obtenu aucune valeur de retour pour may qui est correcte, mais chaque fois que j'essaie de compter (distinct), j'obtiendrai 1 comme valeur de retour. Ceci est mon sql

SELECT 

    count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
    x.employee_id 
     ELSE 0 END)) as test_may 
FROM(
(
SELECT 

    h.month, 
    h.employee_id, 
    eb.employee_no, 
    ee.company_code, 
    h.amount, 
    h.year, 
    h.trx_type, 
    h.trx_code, 
    v.trx_desc, 
    h.frequency, 
    h.run_sequence 

FROM 
    v_employee h, 
    v_trans v, 
    employee_emp ee, 
    employee eb   
    WHERE 
     (h.year = 2014) AND 
     (h.employee_id = ee.employee_id) AND 
     (ee.employee_id = eb.employee_id) AND 
     (h.employee_no = eb.employee_no) AND 
     (h.trx_code = v.trx_code) AND 
     (h.trx_type = v.trx_type) AND 
     (v.company_code = ee.company_code OR v.company_code is NULL) AND 
     (h.trx_type IN ('S','B','N','O','A','D','L')) 
) 
)x, 
employee_emp ee, 
employee eb 

WHERE 

    (x.employee_id = ee.employee_id) AND 
    (ee.employee_id = eb.employee_id) AND 
    (x.employee_no = eb.employee_no) AND 
    (x.year = 2014) 
+0

Mysql n'est pas SQL-Server, donc j'ai supprimé le tag – Jens

+0

COUNT DISTINCT n'est pas cassé, ni SQL, la langue. Quelles sont vos données, qu'attendez-vous et qu'as-tu obtenu? Si une ligne est retournée, le résultat sera 1 –

+0

Le résultat dépendra simplement de votre deuxième requête ... mieux vaut le vérifier par vous-même. –

Répondre

2

Le count que vous avez maintenant également compter le 0 qui est dans la clause ELSE de l'expression CASE. Même avec DISTINCT encore une instance de ce 0 sera comptée.

Retirez le ELSE 0 afin que vous ayez NULL - qui ne sont pas comptabilisés:

count (distinct(CASE WHEN x.month =5 and x.employee_id <> 0 
        THEN x.employee_id 
       END)) as test_may 

Notez que avec NULLIF vous pouvez raccourcir cette expression:

count (distinct(CASE x.month WHEN 5 THEN NULLIF(x.employee_id, 0) END)) as test_may 
+0

Merci. Ça fonctionne bien! – gpsrosak

1

Votre count retournera la même compte même dans les deux cas. Parce que vous donnez la valeur de Count dans les deux cas.

Changement de

count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
    x.employee_id 
     ELSE 0 END)) 

Pour

count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
    x.employee_id 
     ELSE NULL END)) 

Count va juste compter les valeurs que ce soit 0 ou 100 comme 1 & sauter des valeurs nulles tout en comptant. Donc, dans la condition Else NULL vous donnera une sortie correcte.

+0

Merci. Cela fonctionne parfaitement. J'ai négligé l'ELSE 0, merci !!!! – gpsrosak

+0

Vous êtes les bienvenus @gpsrosak –