2016-08-01 1 views
0

J'ai view_dtr avec les colonnes Undertime, LateAM et LatePM Je dois obtenir le TotalUndertime si LateAM ou LatePMIS NOT NULL.obtenir la somme par mois en fonction des données d'une autre colonne si elle n'est pas nulle, donc si elle est nulle alors il ne sera pas ajouté au total

| EmpID | DatePresent | Undertime | LateAM | LatePM | 
| 305001 | 2016-04-01 | 00:10:00 | 01:00:00 | 00:12:00 | 
| 305001 | 2016-04-02 | 00:15:00 |   |   | 
| 305001 | 2016-04-03 | 00:20:00 | 00:05:00 |   | 
| 305001 | 2016-04-04 | 00:05:00 |   | 00:01:00 | 
| 305002 | 2016-04-01 | 00:01:00 |   | 00:10:00 | 
| 305002 | 2016-04-02 | 00:10:00 |   |   | 
| 305002 | 2016-04-03 | 00:10:00 | 00:02:00 | 00:03:00 | 

Le TotalUndertime pour EmpID = 305001 ne doit être 00:35:00 et EmpID = 305002 devrait être 00:11:00. Je continue à obtenir la somme entière en utilisant l'instruction CASE.

CASE WHEN LateAM IS NOT NULL AND Undertime IS NOT NULL 
     THEN SEC_TO_TIME(SUM(TIME_TO_SEC(Undertime))) 
    WHEN LatePM IS NOT NULL AND Undertime IS NOT NULL 
     THEN SEC_TO_TIME(SUM(TIME_TO_SEC(Undertime))) 
    ELSE NULL 
END AS TotalUndertime 
FROM view_dtr 
GROUP BY EmpID, MONTH(DatePresent) 

Toute aide ou suggestion est grandement appréciée. désolé d'être un débutant.

+0

Pouvez-vous publier des données, y compris les colonnes EmpID et DatePresent? – olegsv

Répondre

0

Vous devez faire la CASEà l'intérieur le SUM(), car l'agrégation se produit après avoir sélectionné.

Vous n'avez pas non plus besoin de filtrer Undertime = NULL car ceux-ci sont ignorés lors de la sommation.

SELECT SEC_TO_TIME(SUM(CASE WHEN LateAM IS NOT NULL OR LatePM IS NOT NULL 
          THEN TIME_TO_SEC(UnderTime) 
         END)) AS TotalUndertime 
FROM view_dtr 
GROUP BY EmpID, MONTH(DatePresent) 
+0

Je pensais que cette instruction 'SEC_TO_TIME (SUM (TIME_TO_SEC (Undertime)))' pense que CASE m'aidera. Il a fait, mais je l'ai juste mis dans le mauvais. Merci pour ça. Je suis très reconnaissant. – Clorae