SQL行轉列:decode函數


  前言

  開發中我們經常會用到行轉列,這里記錄一下我在項目中實現行轉列的思路。需求:報表模塊,統計某機房機架的不同狀態(1 空閑  2 預占  3 占用)的數量(真實需求更為復雜,這里只是討論技術,簡化一下)

 

  decode函數

  以下介紹摘自百度百科:

  DECODE函數是ORACLE PL/SQL的功能強大的函數之一,以其簡潔的運算方式,可控的數據模型和靈活的格式轉換而聞名。目前還只有ORACLE公司的SQL提供了此函數,其它數據庫廠商的SQL實現還沒有此功能。

  在DECODE的語法中,實際上就是這樣的邏輯處理過程。它的語法如下:
  DECODE(value, if1, then1, if2,then2, if3,then3, . . . ,else )
  Value 代表某個表的任何類型的任意列或一個通過計算所得的任何結果。當每個value值被測試,如果value的值為if1,Decode 函數的結果是then1;如果value等於if2,Decode函數結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等於給出的任何配對時,Decode 結果就返回else 。
 

  編寫SQL

  res_rack機架表,先按狀態分組,查詢出狀態值、已經對應的數量,此時是行數據

select ra.service_status status, count(ra.id) counts --先查詢出行數據,狀態值對應的數量
  from res_rack ra --機架表
 where ra.roomid = '2' --所屬機房
 group by ra.service_status

 

  再利用decode跟sum函數進行值的判斷跟統計,完成行轉列

select sum(decode(t.status, '1', t.counts, 0)) idle, -- 1 為空閑
       sum(decode(t.status, '2', t.counts, 0)) reserved, -- 2 為預占
       sum(decode(t.status, '3', t.counts, 0)) occupied -- 1 為占用
  from (select ra.service_status status, count(ra.id) counts --先查詢出行數據,狀態值對應的數量
          from res_rack ra --機架表
         where ra.roomid = '2' --所屬機房
         group by ra.service_status) t --按照狀態值分組

 

   20.19-07-29補充:MySql是IF函數,用法跟Oracle的DECODE函數一樣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM