Oracle中的[行轉列]與[列轉行]

目錄

一、原始數據

二、行轉列的多種實現方式

1.CASE WHEN

2.DECODE

3.PIVOT(Oracle獨有)

4.使用LEAD開窗函數

三、列轉行的多種實現方式

1.UNPIVOT(Oracle獨有)

2.UNION ALL合并結果集

四、行轉列練習:CASE WHEN/DECODE/PIVOT/lag/LEAD?

1.CASE WHEN

2.DECODE

3.PIVOT

4.LEAD


一、原始數據

CREATE TABLE T_SCORE (SNO NUMBER,CLA VARCHAR2(20),SCORE NUMBER);INSERT INTO T_SCORE VALUES (101,'語文',88);
INSERT INTO T_SCORE VALUES (101,'數學',89);
INSERT INTO T_SCORE VALUES (101,'英語',90);
INSERT INTO T_SCORE VALUES (102,'語文',91);
INSERT INTO T_SCORE VALUES (102,'數學',77);
INSERT INTO T_SCORE VALUES (102,'英語',56);
INSERT INTO T_SCORE VALUES (103,'語文',77);
INSERT INTO T_SCORE VALUES (103,'數學',88);
INSERT INTO T_SCORE VALUES (103,'英語',99);
INSERT INTO T_SCORE VALUES (104,'語文',77);
INSERT INTO T_SCORE VALUES (104,'數學',66);
INSERT INTO T_SCORE VALUES (104,'英語',55);
INSERT INTO T_SCORE VALUES (105,'語文',44);
INSERT INTO T_SCORE VALUES (105,'數學',67);
INSERT INTO T_SCORE VALUES (105,'英語',78);
INSERT INTO T_SCORE VALUES (106,'語文',89);
INSERT INTO T_SCORE VALUES (106,'數學',98);
INSERT INTO T_SCORE VALUES (106,'英語',78);
INSERT INTO T_SCORE VALUES (107,'語文',67);
INSERT INTO T_SCORE VALUES (107,'數學',56);
INSERT INTO T_SCORE VALUES (107,'英語',54);
INSERT INTO T_SCORE VALUES (108,'語文',76);
INSERT INTO T_SCORE VALUES (108,'數學',78);
INSERT INTO T_SCORE VALUES (108,'英語',12);
COMMIT;SELECT * FROM T_SCORE;

二、行轉列的多種實現方式

原格式:

行轉列后的格式:

1.CASE WHEN

select SNO, CASE WHEN CLA = '語文' THEN SCORE end as 語文, CASE WHEN CLA = '數學' THEN SCORE end as 數學, CASE WHEN CLA = '英語' THEN SCORE end as 英語
from T_SCORE;

?

下面兩種聚合函數都可以:?

select SNO, max(CASE WHEN CLA = '語文' THEN SCORE end) as 語文, max(CASE WHEN CLA = '數學' THEN SCORE end) as 數學, max(CASE WHEN CLA = '英語' THEN SCORE end) as 英語
from T_SCORE
group by SNO
order by SNO;select SNO, sum(CASE WHEN CLA = '語文' THEN SCORE end) as 語文, sum(CASE WHEN CLA = '數學' THEN SCORE end) as 數學, sum(CASE WHEN CLA = '英語' THEN SCORE end) as 英語
from T_SCORE
group by SNO
order by SNO;

二者區別:?

聚合函數邏輯處理重復記錄適用場景
MAX返回分組內的最大值。若每組只有一個值,則直接返回該值。保留最大值(如補考成績)。行轉列(提取唯一值)。
SUM返回分組內所有值的總和。若每組只有一個值,則返回該值本身。累加所有值(可能導致成績異常)。統計總分或合計。

2.DECODE

select SNO, decode(CLA, '語文', SCORE) as 語文, decode(CLA, '數學', SCORE) as 數學, decode(CLA, '英語', SCORE) as 英語
from T_SCORE;

?

select SNO, max(decode(CLA, '語文', SCORE)) as 語文, max(decode(CLA, '數學', SCORE)) as 數學, max(decode(CLA, '英語', SCORE)) as 英語
from T_SCORE
group by SNO
order by SNO;select SNO, sum(decode(CLA, '語文', SCORE)) as 語文, sum(decode(CLA, '數學', SCORE)) as 數學, sum(decode(CLA, '英語', SCORE)) as 英語
from T_SCORE
group by SNO
order by SNO;

?

3.PIVOT(Oracle獨有)

語法:

PIVOT (SUM(聚合值) FOR 待轉換的列名 IN (待轉換的列名里面的值 轉換后列的別名))
select *
from T_SCOREPIVOT (sum(SCORE) for CLA in ( '語文' Chinese,'數學' Math,'英語' English))
order by SNO;

4.使用LEAD開窗函數

因為要對中文進行排序,所以先使用ASCII碼

SELECT CLA, ASCII(CLA)
FROM T_SCORE
GROUP BY CLA
ORDER BY CLA;

?

SELECT *
FROM (SELECT sno, LEAD(score, 0) OVER (PARTITION BY sno ORDER BY CLA ) 數學, LEAD(score, 1) OVER (PARTITION BY sno ORDER BY CLA ) 英語, LEAD(score, 2) OVER (PARTITION BY sno ORDER BY CLA ) 語文FROM T_SCORE)
WHERE 語文 IS NOT NULL;

?

三、列轉行的多種實現方式

DROP TABLE b_score;
CREATE TABLE b_score AS
SELECT *
FROM (SELECT *FROM t_scorePIVOT (SUM(score) -- 聚合函數(使用 SUM 或 MAX 均可)FOR cla IN ('語文' AS 語文, -- 指定課程名稱及對應的列別名'數學' AS 數學,'英語' AS 英語)))
ORDER BY sno; -- 按學生編號排序
COMMIT;
SELECT *
FROM b_score;

?原格式:

行轉列后的格式:

1.UNPIVOT(Oracle獨有)

語法:

UNPIVOT (存儲指標值的列名 FOR 合并后的列名 IN (待合并的列名))
SELECT *
FROM b_scoreUNPIVOT (score FOR cla IN (語文,數學,英語));

?

2.UNION ALL合并結果集

SELECT sno,'語文' cla,語文 score FROM b_score
UNION ALL
SELECT sno,'數學' cla,數學 score FROM b_score
UNION ALL
SELECT sno,'英語' cla,英語 score FROM b_score
order by SNO;

?

四、行轉列練習:CASE WHEN/DECODE/PIVOT/lag/LEAD?

輸出每個部門的總人數,展示樣式:

D10 ?D20 ?D30

? ?3? ? ? 5? ? ? ?6?

1.CASE WHEN

select COUNT(case when DEPTNO = 10 then 1 end) as D10, COUNT(case when DEPTNO = 20 then 1 end) as D20, COUNT(case when DEPTNO = 30 then 1 end) as D30
from EMP;

2.DECODE

select COUNT(DECODE(DEPTNO, 10, 1)) as D10, COUNT(DECODE(DEPTNO, 20, 1)) as D20, COUNT(DECODE(DEPTNO, 30, 1)) as D30
from EMP;

3.PIVOT

SELECT DEPTNO, COUNT(EMPNO) CM
FROM EMP
GROUP BY DEPTNO;

?

select *
from (SELECT DEPTNO, COUNT(EMPNO) CMFROM EMPGROUP BY DEPTNO)pivot (sum(cm) for DEPTNO in (10 D10,20 D20,30 D30));

?

4.LEAD

select DEPTNO, count(empno) ct
from EMP
group by DEPTNO;

?

SELECT *
FROM (select lead(ct, 0) over ( order by DEPTNO) as D10, lead(ct, 1) over ( order by DEPTNO) as D20, lead(ct, 2) over ( order by DEPTNO) as D30from (select DEPTNO, count(empno) ctfrom EMPgroup by DEPTNO)) a
WHERE D30 IS NOT NULL;

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81317.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Excel VBA 】窗體控件分類

一、Excel 窗體控件分類 Excel 中的窗體控件分為兩大類型,適用于不同的開發需求: 類型所在選項卡特點表單控件開發工具 → 插入 → 表單控件簡單易用,直接綁定宏,兼容性好,適合基礎自動化操作。ActiveX 控件開發工具…

[ 計算機網絡 ] 深入理解OSI七層模型

🎉歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? 🎉感謝各位讀者在百忙之中抽出時間來垂閱我的文章,我會盡我所能向的大家分享我的知識和經驗📖 🎉希望我們在一篇篇的文章中能夠共同進步!!&…

線性代數之張量計算,支撐AI算法的數學原理

目錄 一、張量計算的數學本質 1、線性代數:張量的幾何與代數性質 2、微積分:梯度與自動微分 3、優化理論:張量分解與正則化 4、張量計算的核心操作 二、張量計算在AI算法中的作用 1、數據表示與處理 2、神經網絡的參數表示 3、梯度計算與優化 三、張量計算在AI中的…

打造一個支持MySQL查詢的MCP同步插件:Java實現

打造一個支持MySQL查詢的MCP同步插件:Java實現 用Java實現一個MCP本地插件,直接通過JDBC操作本地MySQL,并通過STDIO與上層MCP客戶端(例如Cursor)通信。插件注冊一個名為mysql 的同步工具,接收連接參數及SQL…

【數據架構01】數據技術架構篇

? 9張高質量數據架構圖:大數據平臺功能架構、數據全生命周期管理圖、AI技術融合架構等; 🚀無論你是數據架構師、治理專家,還是數字化轉型負責人,這份資料庫都能為你提供體系化參考,高效解決“架構設計難、…

java三種常見設計模式,工廠、策略、責任鏈

設計模式實戰解析 一、工廠模式(點外賣模式) 1. 核心思想 代替直接new對象像點外賣一樣獲取對象 2. 實際應用 Spring框架:BeanFactoryJDBC:DriverManager.getConnection() 3. 三種變體對比 類型特點示例場景簡單工廠一個工…

jenkins使用Send build artifacts over SSH發布jar包目錄配置

本測試用ruoyi-plus的代碼。 1 [GitLab 自動觸發 Jenkins 構建_jenkins構建觸發器沒有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

vscode打開vue + element項目

好嘞,我幫你詳細整理一個用 VS Code 來可視化開發 Vue Element UI 的完整步驟,讓你能舒服地寫代碼、預覽界面、調試和管理項目。 用 VS Code 可視化開發 Vue Element UI 全流程指南 一、準備工作 安裝 VS Code 官網下載安裝:https://code…

黑馬程序員C++2024新版筆記 第4章 函數和結構體

目錄 1.結構體的基本應用 2.結構體成員的默認值 3.結構體數組 4.結構體指針 ->操作符 5.結構體指針數組 1.引入已存在的結構體數組地址 2.通過new操作符申請指針數組空間 6.函數的概念 7.函數的基礎語法 8.無返回值函數和void類型 9.空參函數 10.函數的嵌套調用…

高級前端工程師必備的 JS 設計模式入門教程,常用設計模式案例分享

目錄 高級前端工程師必備的 JS 設計模式入門教程,常用設計模式案例分享 一、什么是設計模式?為什么前端也要學? 1、設計模式是什么 2、設計模式的產出 二、設計模式在 JS 里的分類 三、常用設計模式實戰講解 1、單例模式(S…

Ubuntu+Docker+內網穿透:保姆級教程實現安卓開發環境遠程部署

文章目錄 前言1. 虛擬化環境檢查2. Android 模擬器部署3. Ubuntu安裝Cpolar4. 配置公網地址5. 遠程訪問小結 6. 固定Cpolar公網地址7. 固定地址訪問 前言 本文將詳細介紹一種創新性的云開發架構:基于Ubuntu系統構建Android仿真容器環境,并集成安全隧道技…

Linux Kernel調試:強大的printk(一)

引言 想了好久,還是覺得這個標題才配得上printk!^_^ 我相信,不管做什么開發,使用最多的調試手段應該就是打印了,從我們學習編程語言第一課開始,寫的第一段代碼,就是打印"Hello, world&qu…

基于NLP技術的客戶投訴與需求文本分類方法研究

目錄 摘要 1. 引言 2. 文本分類基礎 2.1 文本分類的定義與類型 2.2 文本分類的評價指標 3. 傳統文本分類方法 3.1 基于TF-IDF和SVM的方法 3.2 基于主題模型和詞向量的改進方法 4. 深度學習文本分類方法 4.1 TextCNN模型 4.2 BiLSTM模型 4.3 注意力機制與Transformer…

#RabbitMQ# 消息隊列入門

目錄 一 MQ技術選型 1 運行rabbitmq 2 基本介紹 3 快速入門 1 交換機負責路由消息給隊列 2 數據隔離 二 Java客戶端 1 快速入門 2 WorkQueue 3 FanOut交換機 4 Direct交換機 5 Topic交換機 *6 聲明隊列交換機 1 在配置類當中聲明 2 使用注解的方式指定 7 消息轉…

【深度學習】多目標融合算法(六):漸進式分層提取模型PLE(Progressive Layered Extraction)

目錄 一、引言 二、PLE(Progressive Layered Extraction,漸進式分層提取模型) 2.1 技術原理 2.2 技術優缺點 2.3 業務代碼實踐 2.3.1 業務場景與建模 2.3.2 模型代碼實現 2.3.3 模型訓練與推理測試 2.3.4 打印模型結構 三、總結 一…

【Java開發日記】如何使用Java開發在線生成 pdf 文檔

一、介紹 在實際的業務開發的時候,研發人員往往會碰到很多這樣的一些場景,需要提供相關的電子憑證信息給用戶,例如網銀/支付寶/微信購物支付的電子發票、訂單的庫存打印單、各種電子簽署合同等等,以方便用…

Oracle 11g 單實例使用+asm修改主機名導致ORA-29701 故障分析

解決 把服務器名修改為原來的,重啟服務器。 故障 建表空間失敗。 分析 查看告警日志 ORA-1119 signalled during: create tablespace splex datafile ‘DATA’ size 2000M… Tue May 20 18:04:28 2025 create tablespace splex datafile ‘DATA/option/dataf…

消息隊列的使用

使用內存隊列來處理基于內存的【生產者-消費者】場景 思考和使用Disruptor Disruptor可以實現單個或多個生產者生產消息,單個或多個消費者消息,且消費者之間可以存在消費消息的依賴關系 使用Disruptor需要結合業務特性,設計要靈活 什么業務…

《帝國時代1》游戲秘籍

資源類 PEPPERONI PIZZA:獲得 1000 食物。COINAGE:獲得 1000 金。WOODSTOCK:獲得 1000 木頭。QUARRY:獲得 1000 石頭。 建筑與生產類 STEROIDS:快速建筑。 地圖類 REVEAL MAP:顯示所有地圖。NO FOG&#xf…

使用JSP踩過的坑

雖然說jsp已經過時了,但是有時維護比較老的項目還是需要的。 下面說下,我使用jsp踩過的坑: 1.關于打印輸出 在jsp中輸出使用 out.println("hello");而不是 System.out.println("hello");如果在定義函數部分需要打印…