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
相關文章
- MySQL 的CASE WHEN 語句使用說明MySql
- SQL Case WhenSQL
- sqlserver與oracle case when else ,isnull語法差別SQLServerOracleNull
- PLSQL條件(CASE WHEN)語句小應用SQL
- SQL中的CASE WHEN使用SQL
- SQL Case when 的使用方法SQL
- sql中case when的小學SQL
- SQL Server中count(*)和Count(1)的區別SQLServer
- SQl CASE 語句的巢狀使用方式SQL巢狀
- mysql中的case when 與if()MySql
- Oracle case when改寫SQLOracleSQL
- PL/SQL Case when應用SQL
- sql case when, Exist ,group by ,聚合SQL
- 【開發篇sql】 條件和表示式(七) decode,case when,connect by 語句SQL
- SQL Server、Oracle中CASE 與COUNT合用計數SQLServerOracle
- MySQL的COUNT語句--count(*)、 count(常量)、 count(列名)MySql
- SQL中的case when then else end用法SQL
- sql server select case when的用法SQLServer
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- count_sum_distinct與nullNull
- JavaScript switch與if else語句的區別JavaScript
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- count(1),count(*),count(列)的區別
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-EXIT WHENSQL
- SQL中CASE語句強大功能詳解SQL
- 關於sql server case when ..else ..end結果型別的小議SQLServer型別
- 【js迴圈語句】for與while的區別JSWhile
- count(*)、count(1)和count(列名)的區別
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-CONTINUE WHENSQL
- Oracle Case WhenOracle
- Oracle Case語句用法Oracle
- Oracle的order by case whenOracle
- java中的switch case語句Java
- sql case語法和plsql case語法!SQL
- ORACLE SQL開發where子句之case-whenOracleSQL
- mysql case when then 使用MySql
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-搜尋CASESQL
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-簡單CASESQL