關於sql中case when用法


需求:查詢幾個游戲在一周內每天的新增人數。

一、用法

case 
  when sex = '1' then '男'
  when sex = '2' then '女'
else '未知' end

Case函數只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。
Case when 相當於一個自定義的數據透視表,group by 是行名,case when 負責列名。

 

二、實例

  1. 與GROUP BY 結合,自定義列聯表統計

  

SELECT country, 
  SUM( CASE WHEN sex = '1' THEN  population ELSE 0 END),  --男性人口 
  SUM( CASE WHEN sex = '2' THEN  population ELSE 0 END)   --女性人口
  FROM  Table_A  GROUP BY country; 
  • 增加分組條件

      

 

          增加分組條件.png

 

  1. 與Group by結合,自定義分組統計

  

/*新建一個表demo*/
CREATE TABLE demo (
  type varchar(10)  NULL,
  num int NULL)

/*插入數據*/
insert into demo values ('A',10);
insert into demo values ('B',10);
insert into demo values ('C',10);
insert into demo values ('D',10);
insert into demo values ('E',10);
insert into demo values ('F',10);
insert into demo values ('G',10);

/*利用CASE WHEN 和 GROUP BY 實現自定義分組合計*/
select 
  case 
    when type in('A','C','D') THEN 'ACD'
    when type in('F','G') THEN 'FG'
  else type end as types,sum(num)
  from demo
  group by 
  case 
    when type in('A','C','D') THEN 'ACD'
    when type in('F','G') THEN 'FG'
  else type end  
  • 原始表


     
    原始表.png
  • select 結果


     
    select結果
  1. 與distinct結合,去重分組統計
select 
  count(distinct case when photo='1'  then id else null end )photo1_count,
  count(distinct case when photo='2'  then id else null end )photo2_count
  from photos

  4.根據條件有選擇的UPDATE

UPDATE Personnel
SET salary =
CASE 
  WHEN salary >= 5000                   THEN salary * 0.9 
  WHEN salary >= 2000 AND salary < 4600  THEN salary * 1.15 
ELSE salary END; 
UPDATE SomeTable 
SET p_key = CASE WHEN p_key = 'a'  THEN 'b' 
WHEN p_key = 'b'  THEN 'a'  ELSE p_key END 
WHERE p_key IN ('a', 'b'); 

  5.兩個表數據是否一致的檢查

--使用IN的時候 
SELECT keyCol, 
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )  THEN 'Matched' 
ELSE 'Unmatched' END Label 
FROM tbl_A; 
 
--使用EXISTS的時候 
SELECT keyCol, 
CASE WHEN EXISTS ( SELECT * FROM tbl_B  WHERE tbl_A.keyCol = tbl_B.keyCol )  THEN 'Matched'  ELSE 'Unmatched' END Label 
FROM tbl_A; 

詳情鏈接:https://www.cnblogs.com/aipan/p/7770611.html

參考:https://www.jianshu.com/p/f098606391ea

     如果寫在TP框架中,例:

 

 

 

 

M('game')
->field('rate,times,CASE WHEN times>0 && times<50 THEN 1 WHEN times>=50 && times<100 THEN 2 WHEN times>=100 && times<500 THEN 3 WHEN times>=500 && times<1000 THEN 4 ELSE 5 END AS flag')
->order('flag,rate DESC')
->select();

看圖中注釋理解場景


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM