2017-05-04 5 views
3

Ich versuche herauszufinden, wie man den exakten Durchschnitt einer Variablen berechnet. Zur Zeit habe ich diese Abfrage: (vereinfacht):Durchschnitt mit Bedingung

select ID , Group_ID, Chargeability,Job_No_, Group_Charg FROM Data1 


ID  Group ID  Chargeability  Job No_  Group Chargeability 
1    a    90    c1     88.11 
1    a    90    c2     88.11 
1    a    90    c3     88.11 
1    a    90    c4     88.11 
2    a    85.6    c8     88.11 
2    a    85.6    c17    88.11 
2    a    85.6    c6     88.11 

Die durchschnittliche berechnet ist nicht die tatsächliche. Die Chargability ist für jede ID festgelegt, so dass der Durchschnitt die Anzahl der Zeilen pro ID nicht berücksichtigen sollte, da es sich nur um einen Ersatz des Werts handelt, da wir eine Menge job_No pro ID haben.

Ie Ich möchte Group_chargeability = (90 + 85.6)/2 anstelle von (90 * 4) + (85.6 * 3)/7 wie derzeit tun.

Die Abfrage besteht aus mehreren Unterabfragen, von denen einige auch Funktion aufrufen. Aus diesem Grund kann ich die Gruppe nicht verwenden, um das Problem, das ich habe, zu lösen.

+0

'avg (deutliche Aufladbarkeit) über (Partition von GROUP_ID)'? Angenommen, Sie wollen den Durchschnitt nach Gruppe ... Ergebnisse in 87,8 Ich glaube. obwohl es möglicherweise falsch behandelt, wie Sie möchten, wenn ID 1 und 3 beide die gleiche Aufladbarkeit in der gleichen Gruppe hatten ... – xQbert

Antwort

2

Verwenden Sie die AVG Funktion mit einem SUB QUERY

SELECT d.ID, d.Group_ID, d.Chargeability, d.Job_No_, 
AVG(SELECT MIN(sub.Chargeability) 
FROM Data1 sub 
WHERE sub.id = d.id AND sub.Job_No_ = d.Job_No_ 
GROUP BY sub.ID) AS GROUP_Chargeability 
FROM Data1 
1

Sie können versuchen, eine verbundene Unterabfrage wie folgt aus:

SELECT d.ID, d.GROUP_ID, d.CHARGEABILITY, d.JOB_NO_, d2.charges 
FROM Data1 d LEFT JOIN 
(SELECT DISTINCT ID, GROUP_ID, AVG(CHARGEABILITY) AS CHARGES FROM Data1) d2 
    ON d2.ID = d.ID AND d2.GROUP_ID = d.GROUP_ID 
1

Um insgesamt die durchschnittliche chargability zu berechnen:

select avg(Chargeability) as avgChargeability 
from (select id, avg(Chargeability) as Chargeability 
     from t 
     group by id 
    ) id; 

Sie kann diesen Wert auf jede Zeile mitbringenoder eine Unterabfrage.

Verwandte Themen