1. 程式人生 > >DECODE函式實現列轉行

DECODE函式實現列轉行

在實際的開發當中有時候會有讓你做統計、做報表。
比如在學生選課管理系統中讓你寫出所有的學生的每一門可的成績,這時候我們寫的SQL得出的結果一般是每一個學生選了好多課,其中每一個課和對應的成績都是一行記錄。

如下格式:

NAME COURSE GREAD
---- ------ -----
dai  java      60
dai  c#	       70
dai  c	       80
dai  sql       90
往往上面的格式不是我們想要的,我們想要的格式像如下所示:
NAME JAVA C# C  SQL
---- ---- -- -- ---
dai	   60 70 80  90
下面我們就構造一個完整的示例來看看上面的情況要如何實現:
CREATE TABLE t(
        name VARCHAR2(10),
        course VARCHAR2(10),
        gread NUMBER
)

BEGIN
	INSERT INTO t VALUES('dai', 'java', 60);
	INSERT INTO t VALUES('dai', 'c#', 70);
	INSERT INTO t VALUES('dai', 'c', 80);
	INSERT INTO t VALUES('dai', 'sql', 90);
	INSERT INTO t VALUES('tu', 'java', 90);
	INSERT INTO t VALUES('tu', 'c#', 80);
	INSERT INTO t VALUES('tu', 'c', 70);
	INSERT INTO t VALUES('tu', 'sql', 60);
END;
以上的程式碼構造好了資料。
下面我們分成兩部來實現學生的成績報表:
1、通過使用DECODE實現行列轉換,查詢出每個學生選的課程和相應的成績。
SELECT name,
	DECODE(course, 'java', gread) AS java,
	DECODE(course, 'c#', gread) AS c#,
	DECODE(course, 'c', gread) AS c,
	DECODE(course, 'sql', gread) AS sql
FROM t;
NAME             JAVA         C#          C        SQL
---------- ---------- ---------- ---------- ----------
dai                60
dai                           70
dai                                      80
dai                                                 90
tu                 90
tu                            80
tu                                       70
tu                                                  60
2、通過使用聚合函式MAX()來實現化散為整

通過第一步的結果,我們發現使用DECODE構造出了由course欄位組成了行,但是我們發現每一個課程和相應的成績還是出現一行。但是你仔細觀察,是不是隻要將同一姓名的每一行往上壓縮一下,就變成了一行了。那我們要怎麼做到嘞?在這裡我們應該想到使用分組(GROUP BY)來實現。

SELECT name,
        MAX(DECODE(course, 'java', gread)) AS java,
        MAX(DECODE(course, 'c#', gread)) AS c#,
        MAX(DECODE(course, 'c', gread)) AS c,
        MAX(DECODE(course, 'sql', gread)) AS sql
FROM t
GROUP BY name;

NAME             JAVA         C#          C        SQL
---------- ---------- ---------- ---------- ----------
dai                60         70         80         90
tu                 90         80         70         60
看得到我們想要的結果了吧。

現在不是流行說"那麼,問題就來了!"這句話麼。的確!對於細心的人來說那麼問題就來了。
在這裡我們為什麼要使用MAX()而不使用SUM()、AVG()等等聚合函式?告訴大家其實在示例中確實上面3個聚合函式都能使用並且都能成功實現。但是如果在聚合函式裡面的值是字元型的使用SUM()、AVG()還行麼?答案是不行了,所以使用MAX()也算是一種相容的考慮的。

相關推薦

DECODE函式實現轉行

在實際的開發當中有時候會有讓你做統計、做報表。 比如在學生選課管理系統中讓你寫出所有的學生的每一門可的成績,這時候我們寫的SQL得出的結果一般是每一個學生選了好多課,其中每一個課和對應的成績都是一行記錄。如下格式: NAME COURSE GREAD ---- ------

Oracle 11g使用UNPIVOT函式實現轉行”,多合併成行

--建立測試表create table email_signup(user_account varchar2(100),signup_date date,user_email varchar2(100),friend1_email varchar2(100),friend2_

Oracle 11g Pivot函式實現轉行

先上語法規範: SELECT ....FROM    PIVOT     (      aggregate-function()      FOR  IN (, ,..., )        ) AS WHERE ..... 通過一個例子說明其用法:select * fro

SqlServer PIVOT函式快速實現行轉,UNPIVOT實現轉行

我們在寫Sql語句的時候沒經常會遇到將查詢結果行轉列,列轉行的需求,拼接sql字串,然後使用sp_executesql執行sql字串是比較常規的一種做法。但是這樣做實現起來非常複雜,而在SqlServer2005中我們有了PIVOT/UNPIVOT函式可以快速實現行轉列和

oracle wm concat函式 用於轉行 逗號分隔

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

hive語句實現轉行

建表語句 CREATE TABLE XXXX表( evel_id string DEFAULT NULL COMMENT 'xxxxid', object_id string DEFAULT NULL COMMENT '所屬物件', obje

Oracle decode函式實現雜亂資料排序

需求 有時我們從資料庫中取到的資料是雜亂的,或者是不是自己想要的順序。我們需要對資料進行有目的的排序 例如:我們取到的資料為:(這不是我們想要的資料) 我們需要資料順序為: 我們需要對現有的資料進行排序 實現 對現有的資料進行排序,使用到

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

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

Oracle SQL函式pivot、unpivot轉置函式實現行轉轉行

函式PIVOT、UNPIVOT轉置函式實現行轉列、列轉行,效果如下圖所示: 1.PIVOT為行轉列,從圖示的左邊到右邊 2.UNPIVOT為列轉行,從圖示的右邊到左邊 3.左邊為縱表,結構簡單,易擴充套件 4.右邊為橫表,展示清晰,方便查詢 5.很多時候業務表為縱表,但是統

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

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

SQL行轉decode函式

  前言   開發中我們經常會用到行轉列,這裡記錄一下我在專案中實現行轉列的思路。需求:報表模組,統計某機房機架的不同狀態(1 空閒  2 預佔  3 佔用)的數量(真實需求更為複雜,這裡只是討論技術,簡化一下)     decode函式   以下介紹摘自百度百科:  

Oracle轉行函式版本不相容解決方案

業務場景 本部落格記錄一下Oracle列轉行函式在Oracle11的一些不相容問題,vm_concat在一些業務場景是必須的。不過這個函式使用要謹慎,底層實現應該也是group by等等實現的,效能並不是特別好。這個函式在Oracle12是沒有的,在Oracle11是不太相容的,Oracle10可以正常使用

Oracle轉行函式使用

一、業務場景 今天需要實現一個table,有一列的效果是:使用者姓名A(賬號a),使用者姓名B(賬號b)...這種格式。這就想到oracle的列轉行函式vm_concat。 可以用類似這種格式wm_concat(a || '(' || b || ')'),a表示使用者名稱欄位,b表示賬號欄位。 例子: &

MySQL if 函式實現類似Oracle decode函式功能

SQL SELECT if(timestampdiff(hour, sa.add_time, now()) < 1000, if(timestampdiff(hour, sa.add_time, now()) < 300, if(timestampd

oracle行轉轉行、連續日期數字實現方式及mybatis下實現方式

九月份複習,十月份考試,十月底一直沒法收心,趕在十一初 由於不可抗拒的原因又不得不重新找工作就;欸~, 又是一番折騰,從入職到現在,可又沒法閒下來了... 這次就簡單介紹下oracle資料庫下如何實現行轉列、列轉行及此在mybatis中的實現方式,就具體用法我就不詳細說了,主要介紹下實戰中所碰到的坑

使用case when,union all實現sql行轉轉行

-- 建表 CREATE TABLE StudentScores ( UserName NVARCHAR(20), -- 學生姓名 Subject

SQL資料庫查詢實現行轉轉行結果SQL語句

 CREATETABLE[StudentScores](    [UserName]NVARCHAR(20),        --學生姓名[Subject]NVARCHAR(30),        --科目[Score]FLOAT,               --成績)INSERTINTO[StudentS

oracle函式之instr()和substr()實現拆分

1、INSTR()函式         在Oracle中可以使用instr()函式對某個字串進行判斷,判斷其是否含有指定的字元。 在一個字串中查詢指定的字元,返回被查詢到的指定的字元的位置。  語法:           instr(sourceString,destStr

Oracle轉行函式 Listagg() 語法詳解及應用例項

工作中用到一段比較複雜的SQL查詢指令碼,使用了listagg()函式實現了具有多個值的欄位的填充(即,列表聚合,list aggregation(我猜的))。說簡單點,listagg()函式可以實現多列記錄聚合為一條記錄,從而實現資料的壓縮、緻密化(data densifi

用pandas裡的groupby函式實現把一個大檔案按某一的型別分成多個檔案

上圖說話,淺顯易懂 大檔案: 可以發現上圖“單元這一行”有三個不同的值,我想以這一列為主鍵,分成三個檔案,檔名以主鍵內容命名,輸出如下圖: 對於GO7-33-286.csv、GO7-35-226.csv、GO7-37-166.csv這三個檔案內容,分別如下: 實現程式