国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

oracle行列互轉常用小技巧總結

來源:懂視網 責編:小采 時間:2020-11-09 15:38:20
文檔

oracle行列互轉常用小技巧總結

oracle行列互轉常用小技巧總結:平時做報表統計數據時,常遇到行列互轉,最后有總計等要求的報表式。 注:下面的sql都是在oracle 10g下寫的。 假如現有一張這樣的數據表: SELECT * FROM studentscores ; 多行轉多列 現客戶要求這樣的式顯示 這樣的式來顯示成績。 方法一: WITH t
推薦度:
導讀oracle行列互轉常用小技巧總結:平時做報表統計數據時,常遇到行列互轉,最后有總計等要求的報表式。 注:下面的sql都是在oracle 10g下寫的。 假如現有一張這樣的數據表: SELECT * FROM studentscores ; 多行轉多列 現客戶要求這樣的式顯示 這樣的式來顯示成績。 方法一: WITH t

平時做報表統計數據時,常遇到行列互轉,最后有總計等要求的報表式。 注:下面的sql都是在oracle 10g下寫的。 假如現有一張這樣的數據表: SELECT * FROM studentscores ; 多行轉多列 現客戶要求這樣的式顯示 這樣的式來顯示成績。 方法一: WITH t1 AS( SEL

平時做報表統計數據時,常遇到行列互轉,最后有總計等要求的報表格式。

注:下面的sql都是在oracle 10g下寫的。

假如現有一張這樣的數據表:

SELECT * FROM studentscores ;

多行轉多列

現客戶要求這樣的格式顯示

這樣的格式來顯示成績。

方法一:

WITH t1 AS(
 SELECT st1.name NAME,st1.score chinese ,0 math, 0 english
 FROM studentscores st1
 WHERE st1.object = '語文'
),
t2 AS(
 SELECT st2.name NAME,0 chinese ,st2.score math, 0 english
 FROM studentscores st2
 WHERE st2.object = '數學'
),
t3 AS(
 SELECT st3.name NAME,0 chinese ,0 math, st3.score english
 FROM studentscores st3
 WHERE st3.object = '英語'
)
SELECT t.name 姓名, SUM(t.chinese) 語文, SUM(t.math) 數學, SUM(t.english) 英語
FROM(
 SELECT t1.name,t1.chinese,t1.math,t1.english
 FROM t1
 UNION ALL
 SELECT t2.name,t2.chinese,t2.math,t2.english
 FROM t2
 UNION ALL
 SELECT t3.name,t3.chinese,t3.math,t3.english
 FROM t3
)t。
GROUP BY t.name

這種方法易理解,但是麻煩,如果學科有非常多的時候,那就麻煩到要命了。

方法二

SELECT st.NAME 姓名,
SUM(DECODE(st.object,'語文',st.score,0)) 語文,
SUM(DECODE(st.object,'數學',st.score,0)) 數學,
SUM(DECODE(st.object,'英語',st.score,0)) 英語
FROM studentscores st
GROUP BY st.NAME ;
方法二對于新手來說,也許不能一下子弄明白,不妨這樣來想想。如果我要求你統計每個學生的總分,你是不是很快就可以寫出來了select st.name,sum(st.score) from studentscores group by name.那么在這條語句的基礎上,我改一改select st.name,sum(decode(st.object,'語文',st.score,0)) 語文 from studentscores st.是不是就只選擇語文了,呵呵


多行轉一列

現在要求這樣的顯示格式:


多行轉成一列的字符串,這讓我們很容易想到oralce中的wm_concat函數的使用

SELECT st.name , wm_concat(st.object || '(' || st.score || ')')
FROM studentscores st
GROUP BY st.name;


一列轉多行

SELECT regexp_substr(t.str,'[^,]+',1,ROWNUM) VALUE
FROM(SELECT 'a,b,c,d' str FROM dual) t
CONNECT BY ROWNUM <= LENGTH(regexp_replace(t.str,'[^,]+'))+1;

可看我的另一篇博文oracle實現類型split效果

列合計

需求效果圖:

方法一

WITH t1 AS(
 SELECT st.NAME 姓名,
 SUM(DECODE(st.object,'語文',st.score,0)) 語文,
 SUM(DECODE(st.object,'數學',st.score,0)) 數學,
 SUM(DECODE(st.object,'英語',st.score,0)) 英語
 FROM studentscores st
 GROUP BY st.NAME 
 ORDER BY st.name DESC 
),
t2 AS(
 SELECT '合計' 姓名,
 SUM(DECODE(st.object,'語文',st.score,0)) 語文,
 SUM(DECODE(st.object,'數學',st.score,0)) 數學,
 SUM(DECODE(st.object,'英語',st.score,0)) 英語
 FROM studentscores st
)
SELECT t1.*
FROM t1
UNION ALL
SELECT t2.*
FROM t2

使用方法一體現不出高手風范,來看看方法二

方法二

SELECT decode(grouping(st.NAME),1,'總計',st.name) 姓名,
 SUM(DECODE(st.object,'語文',st.score,0)) 語文,
 SUM(DECODE(st.object,'數學',st.score,0)) 數學,
 SUM(DECODE(st.object,'英語',st.score,0)) 英語
FROM studentscores st
GROUP BY ROLLUP(st.NAME) 
ORDER BY st.name 

呵呵,是不是覺得高深莫測!!!

這需要你先弄明白rollup,grouping是干嘛的才行,具體細節可參考我的另一篇博文oralce之rollup&grouping

在這簡單說說,group by rollup(st.name)<=>

select * from xxx group by st.name

union all

select * from xxx

就像方法一那樣,先group by st.name得到t1,然后不需要group by求總的得到t2。

GROUPING函數可以接受一列,該列必須是group by中出現的,返回0或者1。如果列值為空,那么GROUPING()返回1;如果列值非空,那么返回0。

行合計

效果圖如下:


學習了上面的行轉列之后,也許你馬上就想到這樣子來

方法一:

WITH st AS(
 SELECT st1.name,st1.object,st1.score
 FROM studentscores st1
 
 UNION ALL
 
 SELECT st2.name,'總計',SUM(st2.score)
 FROM studentscores st2
 GROUP BY st2.name
)
SELECT st.NAME 姓名,
SUM(DECODE(st.object,'語文',st.score,0)) 語文,
SUM(DECODE(st.object,'數學',st.score,0)) 數學,
SUM(DECODE(st.object,'英語',st.score,0)) 英語,
SUM(DECODE(st.object,'總計',st.score,0)) 總計
FROM st
GROUP BY st.NAME ;

嗯,這樣也是不失為一張方法,但是也不用這么麻煩

方法二

SELECT st.NAME 姓名,
SUM(DECODE(st.object,'語文',st.score,0)) 語文,
SUM(DECODE(st.object,'數學',st.score,0)) 數學,
SUM(DECODE(st.object,'英語',st.score,0)) 英語,
SUM(st.score) 總計
FROM studentscores st
GROUP BY st.NAME ;

行列合計


SELECT decode(grouping(st.NAME),1,'總計',st.name) 姓名,
 SUM(DECODE(st.object,'語文',st.score,0)) 語文,
 SUM(DECODE(st.object,'數學',st.score,0)) 數學,
 SUM(DECODE(st.object,'英語',st.score,0)) 英語,
 SUM(st.score) 合計
FROM studentscores st
GROUP BY ROLLUP(st.NAME) 
ORDER BY st.name 



一些報表有些需要更復雜,比如每一種分類都有一個小計,最后再來一個合計,這個可學習我的另一篇博文

oracle之rollup&cube&grouping


聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

oracle行列互轉常用小技巧總結

oracle行列互轉常用小技巧總結:平時做報表統計數據時,常遇到行列互轉,最后有總計等要求的報表式。 注:下面的sql都是在oracle 10g下寫的。 假如現有一張這樣的數據表: SELECT * FROM studentscores ; 多行轉多列 現客戶要求這樣的式顯示 這樣的式來顯示成績。 方法一: WITH t
推薦度:
標簽: 常用 技巧 統計
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 一级毛片一级毛片一级级毛片 | 久久久久久久一精品 | 久久成人a毛片免费观看网站 | 欧美v视频 | 91精品一区二区三区久久久久 | 欧美日韩国内 | 五月天婷婷影院 | 国产精品欧美激情在线播放 | 国产精品久久久久久久久久久久 | 久久久久久亚洲精品中文字幕 | 国产精品福利久久久久久小说 | 国产一区亚洲二区三区毛片 | 欧美精品1区 | 久久一精品 | 欧美天天搞 | 天天做夜夜做久久做狠狠 | 91亚洲国产成人久久精品网址 | 国产在线精品99一卡2卡 | 99久久精品国产综合一区 | 国产成人综合一区精品 | 不卡日本 | 综合 欧美 国产 视频二区 | 无遮挡一级毛片 | 亚洲首页在线观看 | 国产精品久久久久久久牛牛 | 国产精品视频免费看 | 国产免费高清视频在线观看不卡 | 精品视频在线观看一区二区三区 | 91精品国产综合久久久久久 | 最新国产区 | 999国产精品999久久久久久 | 亚洲高清专区 | 亚洲第一区在线观看 | 五十路中文字幕 | 亚洲最新视频在线观看 | 精品一区二区三区免费毛片爱 | 日韩精品一区二区三区在线观看l | 波多野吉衣在线观看 | 国产高清美女一级a毛片 | 日产精品一区二区三区免费 | 婷婷伊人 |