1.タイトルの説明
user_regテーブルのwork_placeフィールドの総数と各領域のパーセンテージをカウントする新しい関数を作成します。(たとえば、work_placeの総数は100、北京での割合は8%、天津など)。
user_reg表:
2.考える
- 統計テーブルplace_percentを作成します
-
最初にSQLステートメントを記述します。user_regテーブルのwork_placeフィールドの総数と、各場所の割合をクエリできます。
SELECT work_place, count(*) AS number, total_number, CONCAT( ' ', ROUND( count(*)*100/ total_number, 2 ), '%' ) AS percent FROM user_reg,( SELECT count(*) AS total_number FROM user_reg ) m GROUP BY work_place;
work_place
グループ化して、count()関数を使用して、あなたは(エイリアス番号から)各グループの数を取得することができます。work_placeの総数を格納する中間テーブルmを作成します。
ROUND(count(*)* 100 / total_number、2)、パーセンテージを計算し、小数点以下2桁を保持します。
CONCAT()スプライシング文字列;
検索結果:
-
SQLステートメントを関数に入れます
CREATE DEFINER=`root`@`localhost` FUNCTION `aaaa`() RETURNS int DETERMINISTIC BEGIN #Routine body goes here... DECLARE name_tmp VARCHAR ( 255 ); DECLARE part_total int; DECLARE total int; DECLARE percent_tmp VARCHAR ( 255 ); DECLARE done INTEGER DEFAULT 0; DECLARE cu CURSOR FOR SELECT work_place,percent,total_number,number FROM (SELECT work_place, count(*) as number ,total_number,CONCAT(' ',ROUND( count(*)*100/ total_number, 2 ), '%' ) AS percent FROM user_reg,( SELECT count(*) AS total_number FROM user_reg ) m GROUP BY work_place)n; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; OPEN cu ; FETCH cu into name_tmp,percent_tmp,total,part_total; WHILE done <> 1 DO INSERT INTO quickcast.place_percent (`name`,percent,total_number,the_number) VALUES (name_tmp,percent_tmp,total,part_total); FETCH cu INTO name_tmp,percent_tmp,total,part_total; END WHILE; RETURN 0; END
10番目、24番目、および27番目は、カーソルを使用して、work_place、percent、total_number、およびsqlステートメントによって取得された数値をテーブルplace_percentに配置します。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1
その意味は次のとおりです。データが返されない場合、プログラムは続行され、変数FOUNDが1に設定されます。この状況は、テーブル名からXXをXXXに選択したときに発生します。結果:
表place_percent:
-
元の質問にもイベントがあり、関数は20秒ごとに実行されるため、ここでは記述しません。
三、注意を払う
上記のsqlステートメントには1055エラーがある可能性があります。これはsql_mode = only_full_group_byと互換性がありません。(mysql 5.7バージョンのデフォルトのSQL構成はsql_mode = "ONLY_FULL_GROUP_BY"であり、この構成は「SQL92標準」を厳密に実装します。)
解決策は、sqlステートメントを(デカルト積を使用して)に変更することです:(ルームメイトがこのメソッドを提供し、彼のmysqlがエラーを報告しました)
SELECT
*,CONCAT(' ', ROUND( total_number * 100 / total_number , 2 ), '%' ) AS percent
FROM
(
SELECT
work_place,
count(*) AS number
FROM
user_reg
GROUP BY
work_place
) as m
cross join (
select count(*) as total_number from user_reg
) as n;