8

私の質問はパーセンテージに関するものです。私は専門家ではないので、より良い方法で説明しようと思います。

私のmysqlサーバーには、たとえば700レコードのテーブルがあります。

+-------+---------+----------+-------+
| Name  | country | language | Birth |
+-------+---------+----------+-------+
| Lucy  | UK      | EN       | 1980  |
| Mari  | Canada  | FR       | 1990  |
| Gary  | Canada  | EN       | 1982  |
| Stacy | Jamaica | EN       | 1986  |
| Joao  | Brasil  | PT       | 1984  |
+-------+---------+----------+-------+

そこで、1980 年から 1985 年までのすべてのレコードをクエリすると、結果は次のようになります。

+------+---------+----------+-------+
| Name | country | language | Birth |
+------+---------+----------+-------+
| Lucy | UK      | EN       | 1980  |
| Gary | Canada  | EN       | 1982  |
| Joao | Brasil  | PT       | 1984  |
+------+---------+----------+-------+

この結果から、次のことを取得したいと思います。

  1. それらの年の間にすべての言語が出現した割合

    EN = 75% (3 is the total in this case)
    PT = 25%
    
  2. 結果のテーブルに表示されるすべての国の出現率

    UK = 33%
    Canada = 33%
    Brasil = 33%
    

結果を変数に変換して、最終的な関数で使用するにはどうすればよいですか。

4

2 に答える 2

1

これはうまくいくかもしれませんが、次のようなものです:

set @total_rows = (SELECT COUNT(*) FROM table WHERE Birth between 1980 and 1985);

SELECT language, percentage
FROM (
    SELECT language, concat(count(language)/@total_rows, "%") AS percentage 
    FROM table WHERE Birth between 1980 and 1985
)
于 2012-10-04T14:02:27.373 に答える
0

コメントでSQLを実行するのはあまり快適ではないため、ここで回答します。

パーセンテージを取得するには、前の出力をビューとして取得し、パーセンテージ列を追加する必要があります。これにより、次のことが実行されます。

select NAME, QUANTITY, QUANTITY/(select count(1) from TABLE) as PERCENTAGE
from (
    select NAME, count(1) as QUANTITY
    from TABLE
    where condition
    group by NAME
)

ただし、単一の行をフェッチするたびにテーブル全体のカウントを呼び出すため、これは実際には最適化されていません。また、MySQLがカウントの結果にインデックスを付ける場合でも、それは最良ではありません。

あなたがすべきことは、最初にテーブルの合計サイズをあなたのphpに入れることです:

select count(1) as totalsize
from TABLE

次に、次のリクエストで使用します。

select NAME, QUANTITY, QUANTITY/[totalsize from php] as PERCENTAGE
from (
    select NAME, count(1) as QUANTITY
    from TABLE
    where condition
    group by NAME
)
于 2012-10-12T05:23:25.747 に答える