mysql では、CASE WHEN 関数を使用してデータのグループ化を完了できます。
CASE WHEN関数はデータを判断してグループ化するために使用されます
MySQL トリガーからのフロー制御ステートメントに関する知識。
CASE WHEN は、SQL プログラミングで一般的に使用される条件制御ステートメントです。
CASE WHEN の機能:
- 新しいデータ項目の処理
目的: 既存のフィールドに応じて、Case When ステートメントを使用して論理的な判断を行い、新しいフィールドを処理できます。
たとえば、新しいフィールド「年齢層」と「資産レベル」が計算されます。
- 概要情報処理
目的: Case When文と集計関数(Sum関数など)を組み合わせることで、より柔軟な集計情報処理機能を実現できます。
ヒント: group by の後にいくつかのフィールドの統計を使用すると非常に便利です。
groupbyの後に性別を数えたいようなもの
- フィルター制御
目的: Case When をフィルター条件で使用して、フィルター条件をより柔軟に制御することもできます。
case when には 2 つの構文があります。2 つの構文の違いは何ですか?
1. 単純な関数: このフィールドの可能な値をすべて列挙します*
CASE [列名]
WHEN [値 1] THEN [結果 1]
WHEN [値 2] THEN [結果 2]
…
ELSE [デフォルト]
終わり
2. 検索機能(条件判定)
判定を記述することができ、検索関数は条件を満たす最初の値のみを返し、その他のケースは無視されます。
場合
WHEN [式] THEN [結果 1]
WHEN [式] THEN [結果2]
…
ELSE [デフォルト]
終わり
-
新しいデータ項目の処理
例; (簡易機能) 主人公の名前に従い、所属する装備を一致させる(「装備」は新規データ項目)
SELECT
NAME '英雄',
CASE NAME
WHEN '德莱文' THEN '斧子'
WHEN '德玛西亚-盖伦' THEN '大宝剑'
ELSE '无'
END [as] '装备'
FROM user_info;
例:(検索機能)年齢に応じて、新規データ項目「年齢層」を作成、フィールドグループ化
-- when 表达式中可以使用 and 连接条件
SELECT
NAME '英雄', age '年龄',
CASE
WHEN age < 18 THEN '少年'
WHEN age < 30 THEN '青年'
WHEN age >= 30 AND age < 50 THEN '中年'
ELSE '老年'
END [as] '年龄段'
FROM user_info;
-
概要情報処理
例:(集計機能と連携)80年代以前と80年代以降の男女の顧客数をカウントします。
SELECT
CASE WHEN birth_dt < mdy(1,1,1980) THEN '80前' ELSE '80后' END as 年龄段
, SUM( CASE WHEN gender = '1' THEN 1 ELSE 0 END) as 男性数量
, SUM( CASE WHEN gender = '2' THEN 1 ELSE 0 END) as 女性数量
FROM custom_info
GROUP BY 年龄段
質問: group byは年齢層を基準にしていますが、グループ化後の集計が見られないようです まず新しいデータ項目「年齢層」を取得してから男性の数を数えるなどSQLの実行処理を考えてください女性は年齢層別に。
例: 各クラスの男子と女子の数を cls_id でカウントします。
use sc_sys;
-- 查看学生表(结果1)
SELECT * FROM tb_student;
-- 按cls_id 分班,创建新的数据项“班别”(结果2)
SELECT *,
CASE cls_id
WHEN 1 THEN '1班'
WHEN 2 THEN '2班'
WHEN 3 THEN '3班'
WHEN 4 THEN '4班'
WHEN 5 THEN '5班'
WHEN 6 THEN '6班'
WHEN 7 THEN '7班'
WHEN 8 THEN '8班'
ELSE '其他班级'
END as 班别
FROM tb_student ORDER BY 班别, ssex DESC;
-- 按cls_id创建班别,并统计每个班别的男、女生数量(结果3)
SELECT
CASE cls_id
WHEN 1 THEN '1班'
WHEN 2 THEN '2班'
WHEN 3 THEN '3班'
WHEN 4 THEN '4班'
WHEN 5 THEN '5班'
WHEN 6 THEN '6班'
WHEN 7 THEN '7班'
WHEN 8 THEN '8班'
ELSE '其他班级'
END 班别
, SUM( CASE WHEN ssex = '男' THEN 1 ELSE 0 END) as 男性数量
, SUM( CASE WHEN ssex = '女' THEN 1 ELSE 0 END) as 女性数量
FROM tb_student
GROUP BY 班别;
ヒント: group by の後にいくつかのフィールドの統計を使用すると非常に便利です。
groupbyの後に性別を数えたいようなもの
-- 按cls_id创建班别,并统计每个班别的男、女生数量(结果4)
SELECT
CASE cls_id
WHEN 1 THEN '1班'
WHEN 2 THEN '2班'
WHEN 3 THEN '3班'
WHEN 4 THEN '4班'
WHEN 5 THEN '5班'
WHEN 6 THEN '6班'
WHEN 7 THEN '7班'
WHEN 8 THEN '8班'
ELSE '其他班级'
END 班别, ssex, COUNT(*) 数量
FROM tb_student
GROUP BY 班别, ssex DESC
ORDER BY 班别;
-- 若报错,将班别改为class,即字段命名最好还用英文
-- Unknown column '班別' in 'order clause'
-
フィルター制御
例:対象顧客リストのスクリーニング、
0200 地域では、資産 100 万以上の顧客をターゲットにします。
他の地域の場合は、500,000 以上の資産を持つ顧客をターゲットにします。
対象顧客の顧客番号、氏名、携帯電話番号、市外局番、総資産を出力します。
SELECT Party_Id, Name, Mobile, Zone_Num, Total_Asset
FROM Custom_Info
WHERE CASE WHEN Zone_Num='0200' THEN Total_Asset>=1000000
ELSE Total_Asset>=500000
END
-- 即针对0200地区,使用条件Total_Asset>=1000000
-- 而针对其他地区,使用条件Total_Asset>=500000
-
その他の機能: 行から列へ
例: 集計関数 sum は、行から列への変換を実現する場合の単純な関数、エイリアスと連携します。
-- 聚合函数 sum 配合 case when 的简单函数实现行转列
SELECT st.stu_id '学号', st.stu_name '姓名',
sum( CASE co.course_name WHEN '大学语文' THEN sc.scores ELSE 0 END ) '大学语文',
sum( CASE co.course_name WHEN '新视野英语' THEN sc.scores ELSE 0 END ) '新视野英语',
FROM edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BY st.stu_id
ORDER BY NULL;
-- 注释:group by后默认排序 后面跟上order by null表示 不排序,查询速度更快。
この機能は前回の投稿で実現したい機能「データ分割処理(Pythonベースのpandasにおけるデータフレームのデータ構造)」リンク https://blog.csdn.net/Cameback_Tang/article/details/102876947 に似ています。
groupbyでも関数が使える場合
-- 查询output的分布
select
case when output < -500 then '(, -500)'
when output < -250 then '[-500, -250)'
when output < -200 then '[-250, -200)'
when output < -128 then '[-200, -128)'
when output < -88 then '[-128, -88)'
when output < -18 then '[-88, -18)'
when output < 0 then '[-18, 0)'
when output = 0 then '0'
else 'else' end output_bin
, count(user_id) cnt
from data_table
group by case when output < -500 then '(, -500)'
when output < -250 then '[-500, -250)'
when output < -200 then '[-250, -200)'
when output < -128 then '[-200, -128)'
when output < -88 then '[-128, -88)'
when output < -18 then '[-88, -18)'
when output < 0 then '[-18, 0)'
when output = 0 then '0'
else 'else' end