一次在做圖表的時候,需要對查詢的數據做些處理,也就是要做行列的轉換工作,原有的數據格式是這樣的:
area | recordmethod | num |
---|---|---|
00 | 1 | 20 |
00 | 0 | 43 |
01 | 1 | 32 |
01 | 0 | 245 |
其中recordmethod字段1代表web錄入,0代表客戶端client錄入,需要把數據編程這樣:
area | webnum | clientnum |
---|---|---|
00 | 20 | 43 |
01 | 32 | 245 |
剛開始的想法是這樣的,結果表中的webnum和clientnum在原表中是沒有的,感覺要用case when函數的話需要先把這個字段虛擬出來,於是就先寫了這麼一句sql:
select area,'0' as webnum,'0' as clientnum, recordmethod,num from table1;
下面就開始使用case when函數:
SELECT
a.area,
CASE
a.webnum
WHEN a.recordmethod=1
THEN a.num
ELSE 0
END AS webnum,
CASE
a.clientnum
WHEN a.recordmethod=0
THEN a.num
ELSE 0
END AS clientnum
FROM table2 as a;
table2就是上一個語句得到的結果表,這句sql邏輯看上去很明白,就是如果recordmethod等於1,就把num值賦值給webnum,等於0則賦值給clientnum,然後在用sum函數彙總一下:
SELECT
b.area,
SUM(b.webnum) AS webnum,
SUM(b.clientnum) AS clientnum
FROM table3 as b GROUP BY b.area;
table3就是使用case when函數後得到的那個結果表,然後就有了下面這樣的結果:
area | webnum | clientnum |
---|---|---|
00 | 43 | 20 |
01 | 245 | 32 |
看到結果頓時就傻眼了,怎麼會這樣,結果正好一反。反複分析了一下邏輯沒錯啊,sql語句也執行了說明語法上也沒錯啊,那怎麼出來這個結果。
只好求助搜索引擎了,查看了一下case when函數的的使用,恍然大悟,原來case when函數有兩種使用方式,一種是:
case 字段名 when 字段可能的值 then
還有一種是:case when boolean表達式 then
而在mysql中是沒有boolean類型的,也就是沒有true和false這兩個值,它是用數字1和0來分別表示true和false,因此第二個sql中實際上是先判斷了boolean表達式,而webnum和clientnum這兩個字段我都初始化爲0了,因此纔出現了這麼“理所應當”的結果。
認真的學習了sql之後,發現爲了實現這種行列轉換,其實沒有必要這麼複雜,一個語句就可以了:
SELECT
a.area,
SUM(
CASE
WHEN a.recordmethod=1
THEN a.num
ELSE 0
END ) AS webnum,
SUM(
CASE
WHEN a.recordmethod=0
THEN a.num
ELSE 0
END ) AS clientnum
FROM table1;
上面表中的數據只是我模擬的,當時執行完語句後,如果不是對現實情況瞭解可能就不會覺察結果是相反的。如果把這樣的結果呈現給客戶,還不知道要鬧出怎樣的笑話呢。這次有趣的使用經歷,也暴露了自己知識的不足,還需要多加磨練啊。
寫下此文,爲自己做個總結,也給需要使用case when 函數的朋友提個醒,使用函數前一定要對函數的語法做個瞭解,可不要想當然的就去寫了。