7 Stimmen

basic sql : Auswahl von AVG()-Werten aus derselben Spalte mehrmals in einer Abfrage, wenn jeder gewünschte AVG()-Wert eine andere WHERE-Klausel verwendet

Ich möchte drei verschiedene Durchschnittswerte aus einer Spalte (value_to_count) in einer Tabelle abrufen, wobei jeder dieser Durchschnittswerte eine andere WHERE-Klausel hat (je nach Zeit).

Beispielhafte Daten:

###services#### Table
service_id       value_to_count                time
-----------      -----------------------       ---------
     604                    2054               04:04:50
     604                    3444               05:00:15
     604                    2122               07:12:50
     604                    2144               09:10:50
     604                    2001               13:12:53
     602                    2011               15:00:12
     602                    2115               17:22:35
     602                    1411               20:22:12
     602                    1611               21:04:52
     602                    2111               23:43:45

Ich verwende diese Abfrage im Moment, um den Durchschnittswert der Zeit zwischen 18 und 23 zu ermitteln:

Abfrage

SELECT 
service_id AS service, AVG(value_to_count) AS primetime 
FROM services 
WHERE HOUR(time) BETWEEN 18 AND 23 
GROUP BY service_id

Und ich erhalte diese Art von Ergebnissen:

### Result #### 
service          primetime
-----------      --------------      
     604               2154           
     602               2444           

Nun möchte ich neben dem bereits ermittelten Durchschnittswert weitere Werte erhalten. Diesmal möchte ich nur die Durchschnittswerte für "STUNDE(Zeit) ZWISCHEN 06 UND 18" und "STUNDE(Zeit) ZWISCHEN 23 UND 06" abrufen.

Das ist die Form des Ergebnisses, die ich erreichen möchte:

### Wanted Result #### 
service          primetime          other_time_interval_1   other_time_interval_2
-----------      --------------     ----------------        ------------------
     604               2154              2352                      1842
     602               2444              4122                      1224

8voto

a_horse_with_no_name Punkte 489934

Das sollte genügen:

SELECT service_id AS service, 
       AVG(case when HOUR(time) BETWEEN 18 AND 23 then value_to_count else null end) AS primetime,
       AVG(case when HOUR(time) BETWEEN 06 AND 18 then value_to_count else null end) AS other_time_interval_1
FROM services 
GROUP BY service_id

3voto

Damien_The_Unbeliever Punkte 227101

Ich würde zunächst die Zeiträume für die einzelnen Daten festlegen und mich dann um die Gruppierung und Mittelwertbildung kümmern:

;With ServicePeriods as (
    SELECT Service_id,value_to_count,
       CASE WHEN HOUR(time) between 18 and 22 THEN 1
            WHEN HOUR(time) between 06 and 17 THEN 2
            ELSE 3 END as period
    FROM Services
)
select Service_Id,
    AVG(CASE WHEN period=1 THEN value_to_count END) as prime_time,
    AVG(CASE WHEN period=2 THEN value_to_count END) as other_time_interval_1,
    AVG(CASE WHEN period=3 THEN value_to_count END) as other_time_interval_2
from
    ServicePeriods
group by Service_id

(Eigentlich habe ich es zuerst so gemacht, dass ich es als 3 separate Zeilen ausgegeben habe, aber jetzt habe ich es so gedreht, wie Sie es wollten)

Denn mein erstes CASE deckt alle Zeiträume ab, ich muss nicht über "zwischen 23 und 06" nachdenken. Beachten Sie, dass ich auch die Bereiche angepasst habe, um Doppelzählungen zu vermeiden.

Wenn Sie explizit prüfen wollen, ob HOUR(time) between 23 and 06 (oder 05), können Sie Folgendes tun HOUR(time) >= 23 or HOUR(time) <= 6 (oder < ). Beachten Sie, dass Sie OR no AND

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X