2017-05-24 4 views
0

So habe ich eine Datenbank mit mehreren SKU und Preisen. Es gibt ungefähr 10 Preise pro Sku. Was ich versuche, ist ein Mittelwert und Median aus dem unten stehenden Skript.GROUP BY zu Array

function calculate_median($arr) { 
    sort($arr); 
    $count = count($arr); //total numbers in array 
    $middleval = floor(($count-1)/2); // find the middle value, or the lowest middle value 
    if($count % 2) { // odd number, middle is the median 
     $median = $arr[$middleval]; 
    } else { // even number, calculate avg of 2 medians 
     $low = $arr[$middleval]; 
     $high = $arr[$middleval+1]; 
     $median = (($low+$high)/2); 
    } 
    return $median; 
} 

function calculate_average($arr) { 
    $count = count($arr); //total numbers in array 
    foreach ($arr as $value) { 
     $total = $total + $value; // total value of array numbers 
    } 
    $average = ($total/$count); // get average value 
    return $average; 
} 

$home_values_array = array("100000", "120000", "150000", "157000", "180000", "198000", "220000", "1450000"); 

$median_home_value = calculate_median($home_values_array); 
echo '<p>Median home value: $'.number_format($median_home_value).'<br />'; 
$average_home_value = calculate_average($home_values_array); 
echo 'Average home value: $'.number_format($average_home_value).'</p>'; 

Also meine Frage ist, wie kann ich gruppenspezifische sku so dass ich wie mehrere Arrays der Preise pro sku Schleife heraus im Skript oben ..

$home_values_array = array("100000", "120000", "150000", "157000", "180000", "198000", "220000", "1450000"); 

Ein Beispiel für die Datenbank Felder:

SKU PRICE 
123 454.60 
123 723.74 
123 523.11 
321 21.00 
321 45.05 
+0

Da die Daten in einer Datenbank ist gibt es einen Grund, warum Sie diese Informationen nicht aus einer SQL-Abfrage abrufen können? Sie scheinen sich sehr viel Mühe zu geben, etwas zu tun, was in SQL einfach ist. –

+0

Ich kann gut gruppieren. aber ich kann es anscheinend nicht in das für die Funktionen benötigte Array-Format bringen. – ValhallaSkies

+0

Warum nicht mit MySQL versuchen? keine Notwendigkeit, alle Zeilen des Codes zu tun wie: 'SELECT sku, AVG (Preis) als Durchschnittspreis von 'Tabelle' GROUP BY sku ' – Nidhi

Antwort

0

hier ein rein SQL Ansatz ist:

SELECT m.sku, AVG(m.price) as median, MAX(a.price) AS average 
FROM 
(
    SELECT 
     sku 
     , price 
     , (SELECT COUNT(*) FROM prices t2 WHERE t2.sku = t3.sku) AS ct 
     , seq 
     , (SELECT COUNT(*) FROM prices t2 WHERE t2.sku < t3.sku) as delta 
    FROM (
     SELECT 
      sku 
      , price 
      , @rownum := @rownum + 1 AS seq 
     FROM (
      SELECT * FROM prices ORDER BY sku, price 
     ) AS t1, (SELECT @rownum := 0) AS x 
     ORDER BY 
      sku 
      , seq 
    ) AS t3 
    HAVING (ct%2 = 0 AND seq-delta BETWEEN FLOOR((ct+1)/2) AND FLOOR((ct+1)/2) +1) 
     OR (ct%2 <> 0 AND seq-delta = (ct+1)/2) 
) AS m 
INNER JOIN (
    SELECT 
     p.sku 
     ,AVG(p.price) AS price 
    FROM 
     prices AS p 
    GROUP BY sku 
) AS a 
    ON a.sku = m.sku 
GROUP BY sku 
ORDER BY sku; 

Hat Tipp auf diese Antwort für die Mittelwertberechnung https://dba.stackexchange.com/questions/158333/median-with-group-by