偶然需要了解,學習了這篇文章,轉載記錄一下
自:http://blog.csdn.net/jxzkin/article/details/7949629
1. 創建測試數據
[html] ? view plain copy
-
CREATE?TABLE?CC??
-
??(Student?NVARCHAR2(2),Course?NVARCHAR2(2),Score?INT??
-
??);??
[html] ? view plain copy
-
INSERT?into?CC???
-
select?N' 張三 ',N' 語文 ',78?from?dual?union?all??
-
select?N' 張三 ',N' 數學 ',87?from?dual?union?all??
-
select?N' 張三 ',N' 英語 ',82?from?dual?union?all??
-
select?N' 張三 ',N' 物理 ',90?from?dual?union?all??
-
select?N' 李四 ',N' 語文 ',65?from?dual?union?all??
-
select?N' 李四 ',N' 數學 ',77?from?dual?union?all??
-
select?N' 李四 ',N' 英語 ',65?from?dual?union?all??
-
select?N' 李四 ',N' 物理 ',85?from?dual?;??
-
commit;??
希望看到查詢結果 :?
[html] ? view plain copy
-
李四 ?77?85?65?65?292??
-
張三 ?87?90?82?78?337??
2. 使用 wm_concat 方法
[html] ? view plain copy
-
SELECT?STUDENT,WM_CONCAT(SCORE),SUM(SCORE)?FROM?CC?GROUP?BY?STUDENT;??
3. 使用 Oracle 11g pivot 方法
[html] ? view plain copy
-
SELECT?KIN.*,??
-
??KIN.a+KIN.b+KIN.c+KIN.d?AS?TOTAL??
-
FROM??
-
??(SELECT???????????????????????????????*??
-
??FROM?CC?PIVOT?(?MAX(SCORE)?FOR?COURSE?IN?(' 語文 '?AS?A?,?' 數學 '?AS?B,?' 英語 '?AS?C,' 物理 '?AS?D)?)??
-
??)?KIN;??
4. 使用 DECODE 方法
[html] ? view plain copy
-
SELECT??
-
student,??
-
MAX(decode(COURSE,?' 語文 ',?SCORE))?A,??
-
MAX(DECODE(COURSE,?' 數學 ',?SCORE))?B,??
-
MAX(DECODE(COURSE,?' 英語 ',?SCORE))?C,??
-
MAX(DECODE(COURSE,?' 物理 ',?SCORE))?D,??
-
SUM(SCORE)?TOTAL??
-
FROM??
-
CC??
-
GROUP?BY??
-
student;??
這樣的問題,要找出他的關鍵點來。其實就是行轉列,這是一位同學在Itpub上的問題。
問題的解決:
建表:
create table t_result
(d varchar2(10),result varchar2(4));
插入數據:
insert into t_result values ('2014-01-01','勝');
insert into t_result values ('2014-01-01','勝');
insert into t_result values ('2014-01-01','負');
insert into t_result values ('2014-01-02','勝');
insert into t_result values ('2014-01-02','負');
insert into t_result values ('2014-01-02','負');
?
寫法如下, 要掃描兩次表
select t1.d,t1.c1 '勝',t2.c2 '負' from
(select count(result) c1,d from t_result where result = '勝' group by d) t1
LEFT outer join
(select count(result) c2,d from t_result where result = '負' group by d) t2
on t1.d = t2.d
行轉列:
SELECT d,SUM(decode(result,'勝',1,0)),SUM(decode(result,'負',1,0))
FROM t_result
GROUP BY d
或
select d,
sum(case result when '勝' then 1 else 0 end )勝,
sum(case result when '負' then 1 else 0 end )負
from t_result group by d order by d;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
