1. 程式人生 > >SQL之case when then用法(用於分類統計)

SQL之case when then用法(用於分類統計)

char purge 格式 但是 統計 spa 比較 log 永遠

ase具有兩種格式。簡單case函數和case搜索函數。

技術分享
--簡單case函數
case sex
  when 1then when 2then 女’
  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 張二                          13 張三                            空的
                                      4 張四                            空的
                                      5 張五                          26 張六                          17 張七                          28 張八                          18 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用法(用於分類統計)