SQL語句case when外用sum與count的區別
如下這個表TEST
:
category | commdity | price
------------+------------+-------
衣服 | T恤 | 1000
辦公用品 | 打孔器 | 500
廚房用具 | 菜刀 | 3000
廚房用具 | 高壓鍋 | 6800
廚房用具 | 叉子 | 500
廚房用具 | 擦菜板 | 880
辦公用品 | 圓珠筆 | 100
衣服 | 運動T恤 | 4000
如果我想把商品按照1000元以下,1000-3000, 3000 以上分為三個檔次顯示出來,正確的語句是:
SELECT SUM (CASE WHEN price <= 1000 THEN 1 ELSE 0 END)AS low,
SUM (CASE WHEN price BETWEEN 1001 AND 3000 THEN 1 ELSE 0 END)AS mid,
SUM (CASE WHEN price > 3000 THEN 1 ELSE 0 END)AS high FROM TEST;
得出結果
low | mid | high
-----+-----+------
5 | 1 | 2
當把上述語句的sum
換成count
時,得出結果:
low | mid | high
-----+-----+------
8 | 8 | 8
如果只是用列來顯示,SELECT COUNT(price) FROM TEST WHERE price <= 1000
可以得出正確的結果:
low
-----
5
所以用sum
的結果是對的。
原因是什麼呢?
三個case
語句效果相同,其實就是類似於增加一個欄位,這個欄位,滿足條件的為1
,不滿足的是0
,這樣sum
的效果,就是將所有的1
加起來,也就是所有滿足條件的記錄個數。
而count
,會不管是1
還是0
,都會統計,這樣怎麼算都是總條目數8個。
實現分組統計
如,我希望統計users
表中每個建立者建立的男性、女性、無性別的使用者總數(資料表中有一個欄位creator_id
,表示建立者的ID
),語句如下:
select u.creator_id 建立者ID,
sum( case u.sex when 1 then 1 else 0 end) 男性,
sum( case u.sex when 2 then 1 else 0 end) 女性,
sum( case when u.sex<>1 and u.sex<>2 then 1 else 0 end) 性別為空
from users u group by u.creator_id;
Oracle CASE WHEN 用法介紹
1. CASE WHEN
表示式有兩種形式
--簡單Case函式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜尋函式
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
2. CASE WHEN
在語句中不同位置的用法
2.1 SELECT CASE WHEN
用法
SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1為男生,2位女生*/
ELSE NULL
END) 男生數,
COUNT (CASE WHEN sex = 2 THEN 1
ELSE NULL
END) 女生數
FROM students GROUP BY grade;
2.3 WHERE CASE WHEN
用法
SELECT T2.*, T1.*
FROM T1, T2
WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
T1.SOME_TYPE LIKE 'NOTHING%'
THEN 1
WHEN T2.COMPARE_TYPE != 'A' AND
T1.SOME_TYPE NOT LIKE 'NOTHING%'
THEN 1
ELSE 0
END) = 1
2.4 GROUP BY CASE WHEN
用法
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class, -- 別名命名
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
3.關於IF-THEN-ELSE
的其他實現
3.1 DECODE()
函式
select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from employees;
貌似只有Oracle
提供該函式,而且不支援ANSI SQL
,語法上也沒CASE WHEN
清晰,個人不推薦使用。
3.2 在WHERE中特殊實現
SELECT T2.*, T1.*
FROM T1, T2
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
OR
(T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
這種方法也是在特殊情況下使用,要多注意邏輯,不要弄錯。
oracle
中when then else
與decode
的兩種用法,null
(
CASE
WHEN T2.BLESSNUM IS NULL
THEN 0
ELSE T2.BLESSNUM
END) AS BLESSNUM
或者
ENCODE( T2.BLESSNUM, NULL,0,T2.BLESSNUM) AS BLESSNUM
ENCODE(t.status,'C','審批通過','P','審批中','N','未提交','D','審批未通過')as status
兩種用法在沒有涉及到的結果通通為null
,判斷一個結果值是否為空用is null
或者is not null
而不是=null
或者==null
相關文章
- case when 語句
- sql case when, Exist ,group by ,聚合SQL
- Oracle case when改寫SQLOracleSQL
- SQL Server CASE WHEN ... THEN ... ELSE ... ENDSQLServer
- SQL Server中count(*)和Count(1)的區別SQLServer
- MySQL的COUNT語句--count(*)、 count(常量)、 count(列名)MySql
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- JavaScript switch與if else語句的區別JavaScript
- SQL中的case when then else end用法 【詳細】轉載SQL
- 【js迴圈語句】for與while的區別JSWhile
- java中的switch case語句Java
- count(*)、count(1)和count(列名)的區別
- mysql中case when的使用MySql
- SQLServer使用case when中的order bySQLServer
- count (*) 和 count (1) 和 count (列名) 區別
- count(*) 和 count(1)和count(列名)區別
- JAVA基礎--Switch case語句Java
- 條件判斷語句 if case
- 語法解析器續:case..when..語法解析計算
- sql語句中#{}和${}的區別SQL
- 03 shell程式設計之case語句與函式程式設計函式
- [20240320]空格與sqlpus的sql語句.txtSQL
- printf格式控制、switch-case語句
- sql學習:終於把sql case語句使用講明白了,一看就懂SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- SQL語句SQL
- SQL語句IN的用法SQL
- SQL語句中not in 和not exist的區別SQL
- SQL語句中exists和in的區別SQL
- 日期與字串的互相轉換SQL語句字串SQL
- do-while語句和while的區別While
- js 學習之路7:switch/case語句的使用JS
- 開心檔之Java switch case 語句Java
- Python中break語句和continue語句有什麼區別?Python
- 【SQL】9 SQL INSERT INTO 語句SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- SQL SELECT 語句SQL