国产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是干嘛的才行,具體細節(jié)可參考我的另一篇博文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
主站蜘蛛池模板: 国产精品欧美激情在线播放 | 天天做天天爱夜夜爽毛片毛片 | 欧美阿v| 亚洲欧美一 | 国产女同一区二区三区五区 | 一级毛片成人免费看a | 久久精品国产亚洲精品2020 | 国产欧美日韩精品综合 | 麻豆精品一区 | 国产 欧美 日韩 在线 | 日韩高清专区 | 国产成人一区 | 日韩美女一区二区三区 | 么公的又大又深又硬想要 | 日本六十路丰满老太交尾 | 日韩高清一区二区三区不卡 | 久久91精品国产一区二区 | 久久伊人色 | 在线 v亚洲 v欧美v 专区 | xxx欧美888 | 亚洲精品在线免费观看视频 | 欧美精品亚洲精品 | 欧美日韩高清在线 | 欧美日比 | 亚洲日韩欧美综合 | 欧美高清亚洲欧美一区h | 久久国产成人精品 | 国产精品99久久久 | 女人18毛片a级毛片一区②区 | 欧美日韩国产亚洲人成 | 国产短视频精品一区二区三区 | 91大神在线精品视频一区 | 好看的电影网站亚洲一区 | 国产亚洲精品成人婷婷久久小说 | 天天搞夜夜 | 一区二区在线播放视频 | 日韩欧美中文在线 | 国产成人精品视频一区二区不卡 | 国产在线精品一区二区三区不卡 | 一级毛片免费视频观看 | 91在线精品亚洲一区二区 |