6

私は次のデータテーブルとデータを持っています:

mysql> describe school_data_sets_numeric_data;
+--------------+----------------+------+-----+---------+----------------+
| Field        | Type           | Null | Key | Default | Extra          |
+--------------+----------------+------+-----+---------+----------------+
| id           | int(11)        | NO   | PRI | NULL    | auto_increment |
| data_set_nid | int(11)        | NO   |     | NULL    |                |
| school_nid   | int(11)        | NO   |     | NULL    |                |
| year         | int(11)        | NO   |     | NULL    |                |
| description  | varchar(255)   | NO   |     | NULL    |                |
| value        | decimal(18,12) | NO   |     | NULL    |                |
+--------------+----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description       | value            |
+----+--------------+------------+------+-------------------+------------------+
| 54 |        19951 |      19944 | 2008 | Asian             |  75.000000000000 |
| 51 |        19951 |      19944 | 2008 | White             | 200.000000000000 |
| 52 |        19951 |      19944 | 2008 | African American  | 100.000000000000 |
| 53 |        19951 |      19944 | 2008 | Hispanic          |  50.000000000000 |
| 55 |        19951 |      19944 | 2008 | Native American   |   9.000000000000 |

生の数値ではなく、データの平均を表示したい。これを生のSQLで実行したいと思います。

例:

+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description       | average          |
+----+--------------+------------+------+-------------------+------------------+
| 54 |        19951 |      19944 | 2008 | Asian             |  17.28%          |
| 51 |        19951 |      19944 | 2008 | White             | 46.06%           |
| 52 |        19951 |      19944 | 2008 | African American  | 23.04%           |
| 53 |        19951 |      19944 | 2008 | Hispanic          |  11.52%          |
| 55 |        19951 |      19944 | 2008 | Native American   |  2.07%           |

これを行うための最良の方法は何ですか?複数のデータセットと年があることに注意してください。

4

3 に答える 3

9

これを行う1つの方法は、平均の分母となる「合計値」を取得するクエリを作成することです。

SELECT SUM(value) AS total_value FROM school_data_sets_numeric_data

そのクエリの結果をテーブルの各行に結合して、平均を計算するために使用できる値と合計を取得します。

SELECT v.id
     , v.data_set_nid
     , v.school_nid
     , v.year
     , v.description
--   , v.value
--   , t.total_value
     , CONCAT(FORMAT(IF(t.total_value=0,0,(v.value*100.0)/t.total_value),2),'%')
       AS `average`
  FROM (SELECT SUM(value) AS total_value FROM school_data_sets_numeric_data) t
 CROSS
  JOIN school_data_sets_numeric_data v

キーワードはオプションですが、後のレビューアへのドキュメントとして機能し、デカルト積を作成するつもりであり、JOINの句をCROSS意図的に省略した(誤って省略したわけではない)ことを知らせます。ON

「平均」を返す式は、表示したとおりに値を表示します...小数点以下2桁に丸められ、末尾にパーセント記号が付きます。

「平均」の計算は簡単です value / total_value * 100

(分子とデモニネーターの両方が整数型である場合は、「整数」の除算に注意してください。この場合は問題になりませんが、分子に10進数のリテラルを掛けて、10進数の値であることを確認します。これにより、10進数の型の値が保証されます。)

式の残りの部分では、「ゼロ除算」例外の回避、小数点以下2桁への丸め、小数点以下2桁のフォーマット、および「%」の追加を扱います。

これらの%記号を揃えたい場合は、その文字列の左側にスペースを入れて、特定の長さにすることができますLPAD(expr,7,' ')。(実際には、%'を追加するCONCATの前にそれを行うと思いますが、実際には問題ではありません。)


たとえば、リターンセット全体ではなく、特定の年と特定のデータセットのサブセットで平均をとる場合は、それらのデータグループごとに「小計」を取得します。

ここでは、特定のdata_set_nidとからの平均を計算していますyear

SELECT v.id
     , v.data_set_nid
     , v.school_nid
     , v.year
     , v.description
--   , v.value
--   , t.total_value
     , CONCAT(FORMAT(IF(t.total_value=0,0,(v.value*100.0)/t.total_value),2),'%')
       AS `average`
  FROM (SELECT u.data_set_nid
             , u.year
             , SUM(u.value) AS total_value 
          FROM school_data_sets_numeric_data u
         GROUP
            BY u.data_set_nid
             , u.year
       ) t
  JOIN school_data_sets_numeric_data v
    ON v.data_set_nid = t.data_set_nid
     , v.year = t.year
于 2012-08-10T18:15:20.243 に答える
3

これを試して。

select @total:=sum(value) from school_data_sets_numeric_data;

select  id, data_set_nid, school_nid, year, description,
concat(round((100*actor_id)/@total,2),"%") as percentage 
from school_data_sets_numeric_data;

入力はそのようなものになります

于 2012-08-10T18:19:10.940 に答える
0

次のことを試してください。sqlfidlleでテスト済み。

select id, data_set_nid,school_nid, year, description, round(value/(select sum(value) from school_data_sets_numeric_data)*100,2) as average from school_data_sets_numeric_data
于 2012-08-10T18:02:03.080 に答える