2016-08-01 38 views
0

Ich habe view_dtr mit Spalten Undertime, LateAM und LatePM Ich muss die bekommen TotalUndertime wenn entweder LateAM oder LatePMIS NOT NULL.Erhalten der Summe pro Monat basierend auf den Daten einer anderen Spalte, wenn es nicht Null ist, daher, wenn es Null ist, dann wird es nicht zur Summe hinzugefügt

| 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 | 

Die TotalUndertime für EmpID = 305001 nur 00:35:00 sein sollte und EmpID = 30500200:11:00 sein sollte. Ich bekomme immer die ganze Summe mit der CASE Anweisung.

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) 

Jede Hilfe und Vorschlag wird sehr geschätzt. Entschuldigung dafür, ein Neuling zu sein.

+0

Können Sie Daten einschließlich EmpID und DatePresent Spalten posten? – olegsv

Antwort

0

Sie benötigen die CASEinnerhalb die SUM(), zu tun, weil die Aggregation nach der Wahl stattfindet.

Sie müssen auch Undertime = NULL nicht herausfiltern, da diese beim Summieren ignoriert werden.

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

Ich überlegte diese Anweisung 'SEC_TO_TIME (SUM (TIME_TO_SEC (Untertime)))' denken, dass CASE mir helfen wird. Es tat, aber ich habe es einfach falsch platziert. Danke dafür. Ich bin sehr dankbar. – Clorae