MySQL でパーセンテージと最初の数パーセントを表示する方法

MySQL でパーセンテージと最初の数パーセントを表示する方法

数日前、友人からこれを書くのを手伝ってほしいと頼まれました。ただ気楽に書きました。難しくはなさそうですが、書いている途中でいくつか問題に遭遇しました。最適化はあまり良くありません。何か良い最適化方法があればぜひ共有してください! (記事末尾のデータベース)

必要とする

1) 全期間の全商品の売上金額比率を照会し、比率の降順で並び替え、累計比率上位80%の商品をフィルタリングし、ランキング商品名、売上金額比率、累計比率を出力します。

2) 各国の販売状況を随時確認し、販売額が10,000を超える場合は合格とみなします。

それ以外の場合は不適格となり、結果は全国売上高実績として出力されます。

3) 中国とイギリスの各月の販売状況を照会します。2020年8月の総販売額が10,000を超える場合は適格とみなされ、それ以外の場合は不適格とみなされます。2020年9月の総販売額が12,000を超える場合は適格とみなされ、それ以外の場合は不適格とみなされます。結果として、その月の中国の販売実績とイギリスの販売実績が出力されます。

実装コード

1)

SELECT a.productID 製品 ID、(a.sale_amount * b.price) 販売額、CONCAT((a.sale_amount * b.price / (select SUM(aa.sale_amount * bb.price) m from 2002a aa left join 2002b bb on aa.productID = bb.productID)) * 100,"%") パーセント 
(@rownum:=0 を選択) r、2002a a、2002b b から 
WHERE (@rownum:=@rownum+1)<=(select round(count(distinct a.productid)*0.8) from 2002a a, 2002b b where a.productID = b.productID) 
AND a.productID = b.productID GROUP BY a.productID ORDER BY (a.sale_amount * b.price) DESC;

2)

SELECT country country、SUM(price*sale_amount) 売上高、if(SUM(price*sale_amount)>10000、'qualified'、'unqualified') パフォーマンス FROM 2002a a、2002b b、2002c c WHERE a.productID=b.productID AND a.customID=c.customID GROUP BY country;

3)

SELECT date_format(zTime,'%Y-%m') 月、SUM(price*sale_amount) 売上高、
if((date_format(zTime,'%Y-%m')='2020-08' AND SUM(price*sale_amount)>10000) OR (date_format(zTime,'%Y-%m')='2020-09' AND SUM(price*sale_amount)>13000) AND country='中国','合格','未合格') 中国の販売実績、
if((date_format(zTime,'%Y-%m')='2020-08' OR SUM(price*sale_amount)>10000) AND (date_format(zTime,'%Y-%m')='2020-09' AND SUM(price*sale_amount)>13000) AND country='UK','Qualified','Unqualified') 2002a a、2002b b、2002c c からの英国の販売実績 
a.productID=b.productID AND a.customID=c.customID AND country IN('中国','英国') AND (date_format(zTime,'%Y-%m')='2020-09' OR date_format(zTime,'%Y-%m')='2020-08') GROUP BY date_format(zTime,'%Y-%m');

クエリ結果の最初の 80% を表示する方法:

達成率表示:

まず、2つの関数concat()とleft()、TRUNCATE(A,B)について学びましょう。

CONCAT(str1,str2,...) は文字列を連結し、パラメータの連結の結果の文字列を返します。いずれかの引数が NULL の場合、NULL を返します。複数回接合可能です。

LEFT(str,length) は文字列を左からインターセプトします。説明: left(インターセプトされたフィールド、インターセプトの長さ)

TRUNCATE(A,B) は、小数点以下 B 桁に切り捨てられた数値 A を返します。 B の値が 0 の場合、結果には小数点または小数部が含まれません。 B を負の数に設定すると、A の小数点の左側の B 桁目から始まるすべての下位値が切り捨てられます (ゼロに戻ります)。すべての数値はゼロに向かって丸められます。

結合します(上記のコードではleftは使用していません):concat ( left (value1 / value2 *100,5),'%') as complaint rate

例:

SELECT id,CONCAT(TRUNCATE(passScore / (danScore+panScore+duoScore) *100,2),'%') としてスコアと合計スコアの比率を取得します。FROM aqsc_kaoshi_record;

最初の数パーセントのデータ(ここでは80%)を取得するためのMySQLクエリを実装します。

MySQL は top と rowid をサポートしておらず、limit を使用しても機能しません。したがって、次のアプローチを使用します。

a.*を選択 
(SELECT @rownum:=0) r,2002a aから 
WHERE (@rownum:=@rownum+1)<=(2002a から round(count(*)*0.8) を選択); 

ここでのrownumは単なる変数名です。他の変数を使用することもできます。

学生テーブルの成績を大きいものから小さいものの順に並べ替えた後の最初の 20% のケース:

@rownum:=@rownum+1、学生.* を選択します。 
FROM (select @rownum:=0) row 、(select * from student order by student.grade desc) student ##sort WHERE @rownum<(select round(count(*)/4) from student) 

ifに加えて、判定表示を実装する例:

選択 
       sum(case when sex = '男' then 1 else 0 end) /* これは男子生徒の数を調べるものです*/
       sum(case when sex = '女' then 1 else 0 end) /* これは女の子の数を求めるものです*/
学生から

データベース

完全なデータベース コードは次のとおりです。

/*
Navicat MySQLデータ転送

ソースサーバー: 最初
ソース サーバー バージョン: 80011
ソースホスト: localhost:3306
ソースデータベース: fr_test_sql

ターゲットサーバータイプ: MYSQL
ターゲット サーバー バージョン: 80011
ファイルエンコーディング: 65001

日付: 2021-12-18 16:06:19
*/

FOREIGN_KEY_CHECKS=0 に設定します。

-- ----------------------------
-- `2002a` のテーブル構造
-- ----------------------------
`2002a` が存在する場合はテーブルを削除します。
テーブル `2002a` を作成します (
  `orderID` varchar(255) NOT NULL,
  `zTime` 日付がNULLではない、
  `productID` varchar(255) NOT NULL,
  `sale_amount` int(11) NOT NULL,
  `customID` varchar(255) NOT NULL,
  主キー (`orderID`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- ----------------------------
-- 2002aの記録
-- ----------------------------
`2002a` 値に ('O001'、'2020-09-10'、'P010'、'96'、'C008') を挿入します。
`2002a` 値に ('O002'、'2020-08-29'、'P008'、'38'、'C007') を挿入します。
`2002a` 値に ('O003'、'2020-08-10'、'P007'、'97'、'C008') を挿入します。
`2002a` 値に ('O004'、'2020-09-27'、'P005'、'62'、'C006') を挿入します。
`2002a` 値に ('O005'、'2020-08-17'、'P007'、'37'、'C009') を挿入します。
`2002a` 値に ('O006'、'2020-09-06'、'P006'、'3'、'C005') を挿入します。
`2002a` 値に ('O007'、'2020-08-30'、'P009'、'86'、'C007') を挿入します。
`2002a` 値に ('O008'、'2020-09-04'、'P001'、'34'、'C007') を挿入します。
`2002a` 値に ('O009'、'2020-09-09'、'P003'、'99'、'C004') を挿入します。
`2002a` 値に ('O010'、'2020-09-06'、'P002'、'65'、'C010') を挿入します。
`2002a` 値に ('O011'、'2020-08-08'、'P005'、'11'、'C002') を挿入します。
`2002a` 値に ('O012'、'2020-09-20'、'P002'、'3'、'C008') を挿入します。
`2002a` 値に ('O013'、'2020-08-15'、'P004'、'9'、'C004') を挿入します。
`2002a` 値に ('O014'、'2020-08-28'、'P007'、'99'、'C010') を挿入します。
`2002a` 値に ('O015'、'2020-08-23'、'P003'、'3'、'C005') を挿入します。
`2002a` 値に ('O016'、'2020-08-08'、'P006'、'51'、'C008') を挿入します。
`2002a` 値に ('O017'、'2020-09-04'、'P009'、'99'、'C002') を挿入します。
`2002a` 値に ('O018'、'2020-08-12'、'P007'、'86'、'C003') を挿入します。
`2002a` 値に ('O019'、'2020-09-22'、'P001'、'73'、'C005') を挿入します。
`2002a` 値に ('O020'、'2020-08-03'、'P009'、'22'、'C006') を挿入します。
`2002a` 値に ('O021'、'2020-08-22'、'P007'、'54'、'C006') を挿入します。
`2002a` 値に挿入します ('O022'、'2020-09-29'、'P005'、'59'、'C005')。
`2002a` 値に ('O023'、'2020-08-15'、'P003'、'45'、'C006') を挿入します。
`2002a` 値に ('O024'、'2020-09-12'、'P001'、'10'、'C004') を挿入します。
`2002a` 値に ('O025'、'2020-08-23'、'P004'、'56'、'C008') を挿入します。
`2002a` 値に ('O026'、'2020-09-17'、'P003'、'57'、'C004') を挿入します。
`2002a` 値に ('O027'、'2020-08-23'、'P002'、'73'、'C003') を挿入します。
`2002a` 値に ('O028'、'2020-09-22'、'P003'、'50'、'C008') を挿入します。
`2002a` 値に ('O029'、'2020-09-22'、'P003'、'70'、'C007') を挿入します。
`2002a` 値に ('O030'、'2020-08-13'、'P006'、'15'、'C002') を挿入します。

-- ----------------------------
-- `2002b` のテーブル構造
-- ----------------------------
`2002b` が存在する場合はテーブルを削除します。
テーブル `2002b` を作成します (
  `productID` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL,
  `productName` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL,
  `price` 小数点(10,0) NOT NULL,
  主キー (`productID`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- ----------------------------
-- 2002年の記録b
-- ----------------------------
`2002b` VALUES ('P001'、'製品A'、'29') に INSERT INTO します。
`2002b` VALUES ('P002', '製品 B', '50') に INSERT INTO します。
`2002b` VALUES ('P003'、'製品 C'、'42') に INSERT INTO します。
`2002b` VALUES ('P004'、'製品 D'、'59') に INSERT INTO します。
`2002b` VALUES ('P005'、'製品 E'、'49') に INSERT INTO します。
`2002b` VALUES ('P006', '製品 F', '10') に INSERT INTO します。
`2002b` VALUES ('P007'、'製品 G'、'23') に INSERT INTO します。
`2002b` VALUES ('P008'、'製品 H'、'24') に INSERT INTO します。
`2002b` VALUES ('P009'、'製品 I'、'50') に INSERT INTO します。
`2002b` VALUES ('P010'、'製品 J'、'64') に INSERT INTO します。

-- ----------------------------
-- `2002c` のテーブル構造
-- ----------------------------
`2002c` が存在する場合はテーブルを削除します。
テーブル `2002c` を作成します (
  `customID` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL,
  `customName` varchar(255) NOT NULL,
  `country` varchar(255) NOT NULL,
  主キー (`customID`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- ----------------------------
-- 2002年の記録
-- ----------------------------
`2002c` VALUES ('C001'、'顧客 A'、'中国') に INSERT INTO します。
`2002c` VALUES ('C002'、'顧客 B'、'フランス') に INSERT INTO します。
`2002c` VALUES ('C003'、'顧客 C'、'中国') に INSERT INTO します。
INSERT INTO `2002c` VALUES ('C004', '顧客 D', 'イギリス');
`2002c` VALUES ('C005', '顧客 E', '米国') に INSERT INTO します。
`2002c` VALUES ('C006', '顧客 F', '中国') に INSERT INTO します。
`2002c` VALUES ('C007'、'顧客 G'、'フランス') に INSERT INTO します。
INSERT INTO `2002c` VALUES ('C008', '顧客 H', 'イギリス');
`2002c` VALUES ('C009', '顧客 I', '米国') に INSERT INTO します。
INSERT INTO `2002c` VALUES ('C010', '顧客 H', 'イギリス');

-- ----------------------------
-- `2003_a` のテーブル構造
-- ----------------------------
`2003_a` が存在する場合はテーブルを削除します。
テーブル `2003_a` を作成します (
  `CLASSNO` varchar(255) デフォルト NULL,
  `STUDENTNO` varchar(255) デフォルト NULL,
  `GRADE` varchar(255) デフォルト NULL
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- ----------------------------
-- 2003年の記録_a
-- ----------------------------
`2003_a` に値 ('CLASS1'、'1001'、'86') を挿入します。
`2003_a` に値 ('CLASS1'、'1002'、'60') を挿入します。
`2003_a` に値 ('CLASS1'、'1003'、'85') を挿入します。
`2003_a` に値 ('CLASS1'、'1004'、'73') を挿入します。
`2003_a` に値 ('CLASS1'、'1005'、'95') を挿入します。
`2003_a` に値 ('CLASS1'、'1006'、'61') を挿入します。
`2003_a` に値 ('CLASS1'、'1007'、'77') を挿入します。
`2003_a` に値 ('CLASS1'、'1008'、'71') を挿入します。
`2003_a` に値 ('CLASS1'、'1009'、'61') を挿入します。
`2003_a` に値 ('CLASS1'、'1010'、'78') を挿入します。
`2003_a` に値 ('CLASS2'、'2001'、'81') を挿入します。
`2003_a` に値 ('CLASS2'、'2002'、'54') を挿入します。
`2003_a` に値 ('CLASS2'、'2003'、'57') を挿入します。
`2003_a` に値 ('CLASS2'、'2004'、'75') を挿入します。
`2003_a` に値 ('CLASS2'、'2005'、'98') を挿入します。
`2003_a` に値 ('CLASS2'、'2006'、'75') を挿入します。
`2003_a` に値 ('CLASS2'、'2007'、'76') を挿入します。
`2003_a` に値 ('CLASS2'、'2008'、'58') を挿入します。
`2003_a` に値 ('CLASS2'、'2009'、'73') を挿入します。
`2003_a` に値 ('CLASS2'、'2010'、'55') を挿入します。
`2003_a` に値 ('CLASS3'、'3001'、'42') を挿入します。
`2003_a` に値 ('CLASS3'、'3002'、'90') を挿入します。
`2003_a` に値 ('CLASS3'、'3003'、'81') を挿入します。
`2003_a` に値 ('CLASS3'、'3004'、'97') を挿入します。
`2003_a` に値 ('CLASS3'、'3005'、'68') を挿入します。
`2003_a` に値 ('CLASS3'、'3006'、'72') を挿入します。
`2003_a` に値 ('CLASS3'、'3007'、'81') を挿入します。
`2003_a` に値 ('CLASS3'、'3008'、'79') を挿入します。
`2003_a` に値 ('CLASS3'、'3009'、'87') を挿入します。
`2003_a` に値 ('CLASS3'、'3010'、'59') を挿入します。

-- ----------------------------
-- `2004_a` のテーブル構造
-- ----------------------------
`2004_a` が存在する場合はテーブルを削除します。
テーブル `2004_a` を作成します (
  `TYEAR` varchar(255) デフォルト NULL,
  `TMONTH` varchar(255) デフォルト NULL,
  `SALE_MONEY` varchar(255) デフォルト NULL
)ENGINE=InnoDB デフォルト文字セット=utf8;

-- ----------------------------
-- 2004年の記録_a
-- ----------------------------
`2004_a` に値 ('2019'、'10'、'1279') を挿入します。
`2004_a` に値 ('2019'、'11'、'2316') を挿入します。
`2004_a` に値 ('2019'、'12'、'2090') を挿入します。
`2004_a` に値 ('2020'、'01'、'1086') を挿入します。
`2004_a` に値 ('2020'、'02'、'2046') を挿入します。
`2004_a` に値 ('2020'、'03'、'0') を挿入します。
`2004_a` に値 ('2020'、'04'、'2959') を挿入します。
`2004_a` に値 ('2020'、'05'、'1314') を挿入します。
`2004_a` に値 ('2020'、'06'、'2751') を挿入します。
`2004_a` に値 ('2020'、'07'、'1492') を挿入します。
`2004_a` に値 ('2020'、'08'、'1414') を挿入します。
`2004_a` に値 ('2020'、'09'、'2895') を挿入します。
`2004_a` に値 ('2020'、'10'、'2999') を挿入します。
`2004_a` に値 ('2020'、'11'、'1982') を挿入します。
`2004_a` に値 ('2020'、'12'、'2793') を挿入します。
`2004_a` に値 ('2021'、'01'、'2156') を挿入します。
`2004_a` に値 ('2021'、'02'、'1733') を挿入します。
`2004_a` に値 ('2021'、'03'、'2184') を挿入します。

-- ----------------------------
-- `t_user` のテーブル構造
-- ----------------------------
`t_user` が存在する場合はテーブルを削除します。
テーブル `t_user` を作成します (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Number',
  `user_access` varchar(20) NOT NULL DEFAULT '' COMMENT 'アカウント',
  `user_token` varchar(20) NOT NULL DEFAULT '123456' COMMENT 'パスワード',
  `user_nick` varchar(20) NOT NULL DEFAULT 'ユーザー名' COMMENT 'ユーザー名',
  `user_gender` ビット(1) NOT NULL DEFAULT b'1' COMMENT '男性の場合は1、女性の場合は0',
  `user_hobbies` varchar(20) NOT NULL COMMENT '趣味',
  `user_type` int(1) NOT NULL DEFAULT '1' COMMENT 'Type',
  主キー (`user_id`)、
  ユニークキー `uk_user_access` (`user_access`) BTREE 使用
) ENGINE=InnoDB AUTO_INCREMENT=7 デフォルト CHARSET=utf8;

-- ----------------------------
-- t_user の記録
-- ----------------------------
INSERT INTO `t_user` VALUES ('1', 'cqswxy', '111111', '重慶ビジネス', '', 'プログラミング、ゲーム', '3');
INSERT INTO `t_user` VALUES ('2', 'zjczjc', '222222', '俊采星驰', '', 'プログラミング、学習', '2');
INSERT INTO `t_user` VALUES ('3', 'cetoox', '333333', '光の速度はゼロです', '', 'ゲーム、勉強', '1');
`t_user` に値 ('4'、'XXX'、'23'、'XXX'、''、'XXXX'、'1') を挿入します。
`t_user` に VALUES ('6', 'dasda', '123456', '虾米', '', 'asd', '5') を挿入します。

-- ----------------------------
-- `t_user_type` のテーブル構造
-- ----------------------------
`t_user_type` が存在する場合はテーブルを削除します。
テーブル `t_user_type` を作成します (
  `user_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_type_name` varchar(2) NOT NULL、
  主キー (`user_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 デフォルト CHARSET=utf8;

-- ----------------------------
-- t_user_type のレコード
-- ----------------------------
`t_user_type` に VALUES ('1', 'rookie') を挿入します。
`t_user_type` に値 ('2'、'Expert') を挿入します。
`t_user_type` に値 ('3'、'凡例') を挿入します。
`t_user_type` に値 ('4'、'Normal') を挿入します。
 

上記は、MySQL でパーセンテージと最初の数パーセントを表示する方法の詳細です。MySQL のパーセンテージ表示の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLクエリの結果は、簡単な方法でパーセンテージで表示されます
  • MySQL での select、distinct、limit の使用
  • MySQL のクエリパフォーマンスに対する制限の影響
  • MySQL データベースの必須条件クエリ ステートメント

<<:  CSSスタイルを使用してシンプルなHTMLログインインターフェースを設計する

>>:  HTML のブロックレベル要素と行レベル要素、特殊文字、ネスト規則

推薦する

Vueのwatch、computed、methodsの違いのまとめ

目次1 はじめに2 基本的な使い方2.1 方法2.2 計算プロパティ2.3 リスナーを見る3 3つの...

WindowsとLinux間でファイルを転送する方法

WindowsとLinux間のファイル転送(1)WinSCPを使用して、WindowsファイルをLi...

Linux でマウントされたファイルシステムの種類を表示する方法

序文ご存知のとおり、Linux は ext4、ext3、ext2、sysfs、securityfs、...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...

MySQL に外部キー制約を追加する具体的な方法

このチュートリアルの動作環境: Windows 7 システム、MySQL 8 バージョン、Dell ...

JavaScript シミュレーション計算機

この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...

SQL 実装 LeetCode (185. 部門内で最も給与の高い上位 3 名)

[LeetCode] 185. 部門別給与上位3位従業員テーブルにはすべての従業員が保持されます。...

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

太陽系の惑星のアニメーション効果を実現するHTML+CSS3コード

太陽系の 8 つの惑星(衛星を除く)のアニメーションを作成します。すべての惑星は太陽の周りを回ってい...

JavaScript の instanceof メソッドの手動実装

1. instanceofの使用法instanceof演算子は、コンストラクター関数のprototy...

ウェブサイトのビジュアルデザインの重要なポイント

手工芸デザインからグラフィックデザイン、そしてウェブデザインまで、デザインの原則は同じままですが、私...

Linux7で仮想ホストを実装する3つの方法

1. 同じIPアドレス、異なるポート番号仮想ホスト 1: ホスト IP アドレスは 172.16.3...

CSS3アニメーションジャミングソリューションについての簡単な説明

なぜ詰まっているのでしょうか?言及しなければならない前提があります。フロントエンド開発者は皆、ブラウ...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...