2017-05-24 11 views
0

私は複数のskuと価格のデータベースを持っています。 skuあたり約10の価格があります。私がしようとしているのは、以下のスクリプトから平均と中央値を得ることです。GROUP BYの配列

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>'; 

だから私の質問は

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

データベースの例..私はループのうち上記のスクリプトのようにSKUあたりの価格の複数のアレイをできるように、Iグループの特定のSKU行う方法であり、フィールド:ここでは

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

データがデータベースにあるので、SQLクエリからこの情報を得ることができない何らかの理由がありますか?あなたはSQLで簡単な何かをするために非常に多くの努力をしているようです。 –

+0

私は罰金でグループ化できます。しかし、私はそれを関数に必要な配列形式にすることはできません。 – ValhallaSkies

+0

MySQLを試してみませんか? 'SELECT sku、AVG(price)as average_price FROM 'table' GROUP BY sku' – Nidhi

答えて

0

は純粋にSQLアプローチです:

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; 

中央値計算のためのこの回答の帽子の先端https://dba.stackexchange.com/questions/158333/median-with-group-by