1. 程式人生 > >oracle使用decode實現豎錶轉橫表 (列轉行)

oracle使用decode實現豎錶轉橫表 (列轉行)

工作中時長會用到豎錶轉橫表(列轉行)例如某商場每天都有營業額,資料庫中營業額儲存的方式是每天很多比每筆對應不同的消費記錄 ,可能有一天的營業額很多 對應的營業額明細就會很多,如果有個需求是要統計每天營業額多少,按天顯示結果該怎麼寫? 下圖的例子是我們資料庫中一張記錄每月營業情況的表,可以看到201501有很多筆記錄,其他月份也有很多。 select amt_fee,inst_datefromR_KC_AGENT_STATISTICS wherei nst_date between 201501 and 201709; 實現方法很簡單,此處需要使用oracle的decode函式。如果使用的是mysql則需要使用case when。當讓oralce也可以使用case when來實現。
select sum(decode(inst_date, 201501, amt_fee, 0)) amtfees_201501,
       sum(decode(inst_date, 201502, amt_fee, 0)) amtfees_201502,
       sum(decode(inst_date, 201503, amt_fee, 0)) amtfees_201503,
       sum(decode(inst_date, 201504, amt_fee, 0)) amtfees_201504,
       sum(decode(inst_date, 201505, amt_fee, 0)) amtfees_201505,
       sum(decode(inst_date, 201506, amt_fee, 0)) amtfees_201506,
       sum(decode(inst_date, 201507, amt_fee, 0)) amtfees_201507,
       sum(decode(inst_date, 201508, amt_fee, 0)) amtfees_201508,
       sum(decode(inst_date, 201509, amt_fee, 0)) amtfees_201509,
       sum(decode(inst_date, 2015010, amt_fee, 0)) amtfees_201510,
       sum(decode(inst_date, 2015011, amt_fee, 0)) amtfees_201511,
       sum(decode(inst_date, 2015012, amt_fee, 0)) amtfees_201512
  from R_KC_AGENT_STATISTICS
 where inst_date between 201501 and 201512;

查詢結果如下: 如果有其他條件也可以在decode中再套一層decode。 再舉一個複雜點的例子 轉之前,同一個chnl_mcht_id,bank_mcht_id,app_key下 可能會有多個不同的acquire_type
select chnl_mcht_id,
       BANK_MCHT_ID,
       decode(max(wechats), 1, 'wechat', '') || '-' ||
       decode(max(alipays), 1, 'alipay', '') || '-' ||
       decode(max(qqs), 1, 'qq', '') || '-' ||
       decode(max(jds), 1, 'jd', '') || '-' ||
       decode(max(baidus), 1, 'baidus', ''),
       APP_KEY
  from (select chnl_mcht_id,
               BANK_MCHT_ID,
               decode(ACQUIRER_TYPE, 'wechat', 1, 0) wechats,
               decode(ACQUIRER_TYPE, 'alipay', 1, 0) alipays,
               decode(ACQUIRER_TYPE, 'qq', 1, 0) qqs,
               decode(ACQUIRER_TYPE, 'jd', 1, 0) jds,
               decode(ACQUIRER_TYPE, 'baidu', 1, 0) baidus,
               APP_KEY
          from (SELECT DISTINCT chnl_mcht_id,
                                BANK_MCHT_ID,
                                ACQUIRER_TYPE,
                                APP_KEY
                  FROM wallet_mcht_info_reg
                 WHERE chnl_mcht_id IS NOT NULL
                 group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY, ACQUIRER_TYPE)
         group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY, ACQUIRER_TYPE)
 group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY
轉之後同一個chnl_mcht_id,bank_mcht_id,app_key下面 不同的acquire_type 被壓縮排一行

相關推薦

oracle使用decode實現 轉行

工作中時長會用到豎錶轉橫表(列轉行)例如某商場每天都有營業額,資料庫中營業額儲存的方式是每天很多比每筆對應不同的消費記錄 ,可能有一天的營業額很多 對應的營業額明細就會很多,如果有個需求是要統計每天營

利用PIVOT將SQL Server2008+

1、需求示意圖 2、建立表結構及資料 IF OBJECT_ID('dbo.OpenSchema') IS NOT NULL DROP TABLE dbo.OpenSchema; CREATE TABLE dbo.OpenSchema ( objectid INT

java實現 tiff圖片 JPG圖片完美解決

一.環境準備 二.程式碼Demo /** * tiff 圖片 轉 JPG 圖片 * @param filePath tiff檔案路徑 */ public static void

sql pivot 和unpivot轉行的用法

sql clas 數據 sele core unp null col style 1、PIVOT用法(行轉列) select * from Table_Score as a pivot (sum(score) for a.name in ([語文],[數學],[外語],[

SQL pivot,unpivot轉行

【pivot】行轉列:多行變一列 假設學生成績表Score1 Name Subject Score 小張 語文 88 小花 數學 89 小張

oracle 資料庫中某個欄位逗號分隔,得到對應中的個數轉行實現方法

由於各種原因,資料的原則問題,導致某個欄位上出現多個數據(依據分隔符隔開),比如 name 欄位為 張三;李四;王五等等 需求:求一張表中name欄位中出現的個數; 想要得到的結果為: 對

sql 縱

end AR gin pos blog innodb sum not cor DROP TABLE IF EXISTS `course`;CREATE TABLE `course` ( `id` int(11) NOT NULL AUTO_INCREMENT, `n

( ) Mysql group_concat 的反向應用實現Mysql轉行

IT 轉換成 sele art start enc star In str 用過Mysql的都知道她有一個很好的實現行轉列功能的函數group_concat函數,非常方便 點擊(此處)折疊或打開 SELECT * FROM group_test;

[]自定義Drawable實現靈動的紅鯉魚動畫上篇

此篇中的小魚動畫是模仿國外一個大牛做的flash動畫,第一眼就愛上它了,簡約靈動又不失美學,於是抽空試著嘗試了一下,如下是我用Android實現的效果圖:   小魚兒

Java線性順序儲存——陣列實現

第一次寫部落格,最近一直在研究資料結構,最開始準備用c語言寫資料資料結構的東西的,發現用c真的寫得我頭痛,果斷用了我喜歡的java實現,其實懂了過後用什麼語言寫都一樣的。不說了,直接上程式碼! 1.定義介面 抽象資料型別的List介面 public interface

mysql 普通分割槽

1.按照現有表結構,建立一個臨時表,用於分割槽錶轉換 mysql> desc ClientActionTrack; +---------------+---------------+------+-----+---------+----------------+ |

java實現阿拉伯數字人民幣大寫精確到分

這是一個將阿拉伯數字轉人民幣大寫的工具類, 精確到人民幣大寫分 package com.client; import java.math.BigDecimal; /** * Class Description : 該類是把阿拉伯數字轉換成中文大寫的類。

oracle大資料千萬級修改,刪除優化技巧【

oracle大資料表(千萬級)修改,刪除優化技巧 執行下面的SQL delete  from idwsq11.SH30_PRCSS_EXCTN_LOG e where deriv_prcss_time_stamp < to_date('2010-JAN-01', 'YYYY-MON-DD'); 省略其他

oracle 非分割槽分割槽

將普通錶轉換成分割槽表有4種方法:        1. Export/import method        2. Insert with a subquery method        3. Partition exchange method        4. DB

利用jquery.form.js的ajaxSubmit實現不跳提交單資料

我們直接通過form提交的話, 提交後當前頁面跳轉到form的action所指向的頁面。然而,很多時候我們比不希望提交表單後頁面跳轉,那麼,我們就可以使用ajaxSubmit(obj)來提交資料 1. //form表單阻止提交 <form onsubm

網頁端如何實現點擊鏈接跳到QQ手機QQ打開會話

tencent 不知道 網頁 使用 跳轉 svi js代碼 ref new 今天給大家分享一下手機或者移動設備上QQ的。大家知道電腦上可以強行聊天,點擊可以直接跳出QQ。那麽在手機上也可以嗎? 既然電腦上有tencent://協議,那麽手機上一定也有吧,抓包分析了一下

C#下實現SQL SERVER資料庫刪除以指定字串開頭的或指定日期前的SQL語句

關於C#下實現控制資料庫執行相應操作,基本所有工作全在SQL語句編寫上。嗯,簡述以下基本流程吧:C#下建立與SQL SERVER的連線------寫相應SQL語句------執行相應的SQL語句,完了。一三兩步都是定式,本人都是抄的,所以現在也記不住。至於中間的SQL語句,話

屏 Activity的切換效果

近來有個需求,使我不得不用豎屏來寫橫屏的介面,雖略顯蛋疼,但也成功寫出,但Activity的轉換過渡效果不同,十分糾結,終於找到一個overridePendingTransition的方法,經過一番研究把豎屏切橫屏的動畫效果大致搞出來了,專案地址在:http:/

PostgreSQL 實現交叉行列轉換的五種方法

這裡我來演示下在POSTGRESQL裡面如何實現交叉表的展示,至於什麼是交叉表,我就不多說了,度娘去哦。原始表資料如下: t_girl=# select * from score;    name  | subject | score    -------+------

python實現九九乘法 ver3.6

菜鳥新手,大家多多指導.print("下面列印九九乘法表".center(60, "=")) for j in range(10): for i in range(j+1): print("%d