2016-04-27 4 views
1

Ich möchte nach allen Stunden zwischen 0 und 40 zu einer Gesamtsumme gruppieren. 41 - 50 in eine Gesamtsumme und 50+ in eine andere Summe.Summe der Stunden und Gruppen von Stunden

select hours, 
     sum(hours) 
from employee 
where hours between 0 and 40 
group by hours; 

Die obigen Abfragegruppen von den Stunden, so habe ich die Ergebnisse von Stunden geteilt, wie wenn ich 1 haben, 2,3, 0,5, 35,5, 30 usw.

1  403 
2.3  4.6 
0.5  53 
35.5 284 
30  1230 

Aber ich etwas will wie 403+4.6+53+284+1230 = 1974.6 weil sie alle unter 40 fallen Wie kann ich es tun?

Antwort

2

Sie eine bedingte Aggregation verwenden können, um einen Wert Gruppierung, die Intervalle von Stunden aufbaut. Durch Ihr Beispiel können Sie nicht ganzzahlige Werte haben, so dass Sie explizite relationalen Operatoren haben, beispielsweise 40,1 in 40-50 Gruppe verwendet werden soll:

select sum(hours), 
     case 
      when hours <= 40 then '0-40' 
      when hours > 40 and hours <= 50 then '41-50' 
      when hours > 50 then '50-...' 
     end 
from employee 
group by case 
      when hours <= 40 then '0-40' 
      when hours > 40 and hours <= 50 then '41-50' 
      when hours > 50 then '50-...' 
     end 
1
select sum(case when hours between 0 and 40 then hours else 0 end) hours_1, 
     sum(case when hours between 41 and 50 then hours else 0 end) hours_41, 
     sum(case when hours > 50 then hours else 0 end) hours_51 
from employee 
1

GROUP -Ing basierend auf CASE

select (case when hours between 0 and 40 
       then '0 - 40' 
       when hours between 41 and 50 
       then '41 - 50' 
       else 
        '50+' 
      end) as hours_range, 
     sum(hours) 
from employee 
group by (case when hours between 0 and 40 
       then '0 - 40' 
       when hours between 41 and 50 
       then '41 - 50' 
       else 
        '50+' 
      end); 
+0

Wie kann sie als Reihen zu bekommen, statt Spalten, muss ich eine Union alle mit einem anderen wählen? – user525146

0
select '1 to 40',sum(hours) 

from employee 
where hours between 0 and 40 

union all 

    select '41 to 50',sum(hours) 

from employee 
where hours between 41 and 50 

union all 

    select '50+',sum(hours) 

from employee 
where hours>50 
+0

Welche Version funktioniert besser, "union all" oder "case" wie in den anderen Antworten – user525146