データジョブの質問:MySql関数

1.タイトルの説明

user_regテーブルのwork_placeフィールドの総数と各領域のパーセンテージをカウントする新しい関数を作成します。(たとえば、work_placeの総数は100、北京での割合は8%、天津など)。

user_reg表:

ここに画像の説明を挿入

2.考える

  1. 統計テーブルplace_percentを作成します

ここに画像の説明を挿入

  1. 最初に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()スプライシング文字列;

    検索結果:

ここに画像の説明を挿入

  1. 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:
    ここに画像の説明を挿入

  2. 元の質問にもイベントがあり、関数は20秒ごとに実行されるため、ここでは記述しません。

三、注意を払う

上記のsqlステートメントには10​​55エラーがある可能性があります。これは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;

おすすめ

転載: blog.csdn.net/weixin_45341339/article/details/111658297