一次有趣的case when函數使用經歷

一次在做圖表的時候,需要對查詢的數據做些處理,也就是要做行列的轉換工作,原有的數據格式是這樣的:

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 函數的朋友提個醒,使用函數前一定要對函數的語法做個瞭解,可不要想當然的就去寫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章