SQL之case when then用法(用於分類統計)
阿新 • • 發佈:2017-09-05
char purge 格式 但是 統計 spa 比較 log 永遠
ase具有兩種格式。簡單case函數和case搜索函數。
--簡單case函數
case sex
when ‘1‘ then ‘男‘
when ‘2‘ then ‘女’
else ‘其他‘ end
--case搜索函數
case when sex = ‘1‘ then ‘男‘
when sex = ‘2‘ then ‘女‘
else ‘其他‘ end
這兩種方式,可以實現相同的功能。簡單case函數的寫法相對比較簡潔,但是和case搜索函數相比,功能方面會有些限制,比如寫判定式。
還有一個需要註重的問題,case函數只返回第一個符合條件的值,剩下的case部分將會被自動忽略。
--比如說,下面這段sql,你永遠無法得到“第二類”這個結果
case when col_1 in (‘a‘,‘b‘) then ‘第一類‘
when col_1 in (‘a‘) then ‘第二類‘
else ‘其他‘ end
下面實例演示:
首先創建一張users表,其中包含id,name,sex三個字段,表內容如下:
SQL> drop table users purge;
drop table users purge
ORA-00942: 表或視圖不存在
SQL> create table users(id int,name varchar2(20),sex number);
Table created
SQL> insert into users(id,name) values(1,‘張一‘);
1 row inserted
SQL> insert into users(id,name,sex) values(2,‘張二‘,1);
1 row inserted
SQL> insert into users(id,name) values(3,‘張三‘);
1 row inserted
SQL> insert into users(id,name) values(4,‘張四‘);
1 row inserted
SQL> insert into users(id,name,sex) values(5,‘張五‘,2);
1 row inserted
SQL> insert into users(id,name,sex) values(6,‘張六‘,1);
1 row inserted
SQL> insert into users(id,name,sex) values(7,‘張七‘,2);
1 row inserted
SQL> insert into users(id,name,sex) values(8,‘張八‘,1);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from users;
ID NAME SEX
--------------------------------------- -------------------- ----------
1 張一
2 張二 1
3 張三
4 張四
5 張五 2
6 張六 1
7 張七 2
8 張八 1
8 rows selected
1、上表結果中的"sex"是用代碼表示的,希望將代碼用中文表示。可在語句中使用case語句:
SQL> select u.id,u.name,u.sex,
2 (case u.sex
3 when 1 then ‘男‘
4 when 2 then ‘女‘
5 else ‘空的‘
6 end
7 )性別
8 from users u;
ID NAME SEX 性別
--------------------------------------- -------------------- ---------- ------
1 張一 空的
2 張二 1 男
3 張三 空的
4 張四 空的
5 張五 2 女
6 張六 1 男
7 張七 2 女
8 張八 1 男
8 rows selected
2、如果不希望列表中出現"sex"列,語句如下:
SQL> select u.id,u.name,
2 (case u.sex
3 when 1 then ‘男‘
4 when 2 then ‘女‘
5 else ‘空的‘
6 end
7 )性別
8 from users u;
ID NAME 性別
--------------------------------------- -------------------- ------
1 張一 空的
2 張二 男
3 張三 空的
4 張四 空的
5 張五 女
6 張六 男
7 張七 女
8 張八 男
8 rows selected
3、將sum與case結合使用,可以實現分段統計。
如果現在希望將上表中各種性別的人數進行統計,sql語句如下:
SQL> select 2 sum(case u.sex when 1 then 1 else 0 end)男性, 3 sum(case u.sex when 2 then 1 else 0 end)女性, 4 sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)性別為空 5 from users u; 男性 女性 性別為空 ---------- ---------- ---------- 3 2 0 -------------------------------------------------------------------------------- SQL> select 2 count(case when u.sex=1 then 1 end)男性, 3 count(case when u.sex=2 then 1 end)女, 4 count(case when u.sex <>1 and u.sex<>2 then 1 end)性別為空 5 from users u; 男性 女 性別為空 ---------- ---------- ---------- 3 2 0
SqlServer mssql 按月統計所有部門案例:
以訂單統計為例,前端展示柱狀圖(Jquery統計):
表及主要字段描述如下;表名:Orders
1.日期CreateTime
2.金額Amount
3.用戶UserID
情況一:
根據部門統計某一年每月銷量(查詢一個部門月統計)
1)直接在SQL語句中判斷每月信息,好處,前臺直接調用;壞處,性能不高。
SQL語句:
SELECT
SUM(CASE WHEN MONTH(s.CreateTime) = 1 THEN s.Amount ELSE 0 END) AS ‘一月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 2 THEN s.Amount ELSE 0 END) AS ‘二月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 3 THEN s.Amount ELSE 0 END) AS ‘三月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 4 THEN s.Amount ELSE 0 END) AS ‘四月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 5 THEN s.Amount ELSE 0 END) AS ‘五月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 6 THEN s.Amount ELSE 0 END) AS ‘六月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 7 THEN s.Amount ELSE 0 END) AS ‘七月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 8 THEN s.Amount ELSE 0 END) AS ‘八月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 9 THEN s.Amount ELSE 0 END) AS ‘九月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 10 THEN s.Amount ELSE 0 END) AS ‘十月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 11 THEN s.Amount ELSE 0 END) AS ‘十一月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 12 THEN s.Amount ELSE 0 END) AS ‘十二月‘
FROM Orders AS s
WHERE YEAR(s.CreateTime) = 2014
--其他條件
結果:
一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 741327.00 120505.00 0.00
2)統計出數據庫裏有值的月份,再前端邏輯判斷其他月份補0
SQL語句:
SELECT
UserID,
MONTH ( CreateTime ) as 月份,
SUM( Amount ) as 統計
FROM
Orders
WHERE
YEAR ( CreateTime ) = 2014 -- 這裏假設你要查 2014年的每月的統計。
--其他條件
GROUP BY
UserID, MONTH ( CreateTime )
結果:
月份 銷售額
10 741327.00
11 120505.00
情況二:
統計所有部門某一年每月銷量
1)此數據量大的話影響性能,SQL語句(這裏未聯查部門表):
SELECT
UserID,
SUM(CASE WHEN MONTH(s.CreateTime) = 1 THEN s.Amount ELSE 0 END) AS ‘一月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 2 THEN s.Amount ELSE 0 END) AS ‘二月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 3 THEN s.Amount ELSE 0 END) AS ‘三月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 4 THEN s.Amount ELSE 0 END) AS ‘四月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 5 THEN s.Amount ELSE 0 END) AS ‘五月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 6 THEN s.Amount ELSE 0 END) AS ‘六月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 7 THEN s.Amount ELSE 0 END) AS ‘七月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 8 THEN s.Amount ELSE 0 END) AS ‘八月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 9 THEN s.Amount ELSE 0 END) AS ‘九月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 10 THEN s.Amount ELSE 0 END) AS ‘十月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 11 THEN s.Amount ELSE 0 END) AS ‘十一月‘,
SUM(CASE WHEN MONTH(s.CreateTime) = 12 THEN s.Amount ELSE 0 END) AS ‘十二月‘
FROM Orders AS s
WHERE YEAR(s.CreateTime) = 2014
group by UserID
結果:
UserID 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 53495.00 0.00
2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 738862.00 37968.00 0.00
3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2099.00 22849.00 0.00
4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 366.00 0.00 0.00
5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 6193.00 0.00
2)百度看到有人提到列轉行,未看到實例,不太清楚具體實現方式。有知道的朋友,請告知,謝謝!
SELECT
UserID,
MONTH ( CreateTime ) as 月份,
SUM( Amount ) as 統計
FROM
Orders
WHERE
YEAR ( CreateTime ) = 2014 -- 這裏假設你要查 2014年的每月的統計。
GROUP BY
UserID,MONTH ( CreateTime )
結果:
UserID 月份 統計
1 10 738862.00
2 10 2099.00
3 10 366.00
4 11 53495.00
1 11 37968.00
2 11 22849.00
5 11 6193.00
SQL之case when then用法(用於分類統計)