CASE WHEN 関数 @SQL の学習

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

 

おすすめ

転載: blog.csdn.net/Cameback_Tang/article/details/108247243