2017-10-20 2 views
0

Ich habe die folgenden Daten in einer MySQL-Tabelle TestMySQL Doppellungs mit Doppel Gruppierung

genannt enter image description here

ich die folgende SQL-Abfrage ausführen

SELECT user_id, 
     group_id, 
     sum(value) as total_present, 
     avg(value)*100 as attendance_percentage 
FROM test t 
WHERE t.session_date BETWEEN '2017-10-01' AND '2017-10-15' 
GROUP BY user_id 

Diese mich Prozentsätze für jede gibt user_id mögen dies:

enter image description here

Wenn Sie sich das obige Ausgabebeispiel ansehen, befinden sich Benutzer-ID 1 und 2 in der gleichen Gruppen-ID. Also gibt es eine Möglichkeit für mich, meine Abfrage weiter zu gruppieren, um dann einen Durchschnitt derselben Gruppen-IDs zu erhalten. So zum Beispiel oben, sollte die group_id 3 Prozent 70,83335

+0

Beitrag die Tabellen und Daten als Text [LESEN] (http://meta.stackoverflow.com/ Fragen/285551/why-may-ich-nicht-upload-images-of-code-auf-so-wenn-eine Frage zu stellen/285557 # 285557) –

+0

Beachten Sie, dass group_id ist ein zufälliger Wert in der Qeury Sie verwendet. Es sieht nicht so aus, als wäre user_id ein PRIMARY KEY oder UNIQUE KEY in der Tabelle .. Also mit 'SELECT user_id, group_id .... GROUP BY benutzer_id' ist keine gültige ANSI GROUP BY ... lesen https: // www .psce.com/de/blog/2012/05/15/mysql-Fehler-do-you-u se-group-by-correct/ –

+0

@RaymondNijland die PK ist ID, ein Benutzer erscheint mehrmals, aber in einem anderen Datum, die Abfrage ist in Ordnung. –

Antwort

0

sein können Sie, indem weitere Aggregation auf Ihre Anfrage

SELECT t.group_id, avg(t.attendance_percentage) as t.group_attendance_percentage 
FROM(
    SELECT user_id, group_id, sum(value) as total_present, avg(value)*100 as attendance_percentage 
    FROM test t 
    WHERE t.session_date BETWEEN '2017-10-01' AND '2017-10-15' 
    GROUP BY user_id 
) t 
GROUP BY t.group_id 
1

Khalid Antwort ist OK. Aber ich denke, du solltest das Problem in Betracht ziehen, dass du verschiedene Dinge mit unterschiedlicher Größe durchschnittst. user_id = 2 hat mehr Werte als user_id = 1, also sollte sein Prozentsatz mehr gewichten.

Zum Beispiel, wenn user_id = 3 nur einmal mit 100% Anwesenheit ging, wird das den durchschnittlichen Wert verzerren.

Sie tun sollten:

SELECT group_id, avg(value) 
FROM yourTable 
GROUP BY group_id 

In diesem Fall wird die AVG() ist 71.42 statt 70.83

+0

Vereinbarte, wenn Sie beide dann zwei Abfragen benötigen. Eine nach Benutzer und eine nach Gruppe gruppiert – Pace