選讀SQL經典實例筆記11_結果集變換

来源:https://www.cnblogs.com/lying7/archive/2023/07/21/17565656.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230719150159605-2139117895.png) # 1. 變換結果集成一行 ## 1.1. 結果集 ```sql DEPTNO CNT 10 3 20 5 30 ...


1. 變換結果集成一行

1.1.  結果集

DEPTNO        CNT
------ ----------
    10          3
    20          5
    30          6

1.2. 結果集

DEPTNO_10  DEPTNO_20  DEPTNO_30
--------- ---------- ----------
        3          5          6

1.3.  sql

select sum(case when deptno=10 then 1 else 0 end) as deptno_10,
        sum(case when deptno=20 then 1 else 0 end) as deptno_20,
        sum(case when deptno=30 then 1 else 0 end) as deptno_30
 from emp

1.3.1. 對於每一行的原始數據,使用CASE表達式把行變換成列

1.4. sql

select max(case when deptno=10 then empcount else null end) as deptno_10,
       max(case when deptno=20 then empcount else null end) as deptno_20,
       max(case when deptno=30 then empcount else null end) as deptno_30
  from (
select deptno, count(*) as empcount
  from emp
 group by deptno
       ) x

1.4.1. 用內嵌視圖生成每個部門的員工總人數

1.4.2. 主查詢里的CASE表達式把行轉換成列

1.4.3. 調用MAX函數把幾列合併為一行

2. 反向變換結果集

2.1. 結果集

DEPTNO_10  DEPTNO_20  DEPTNO_30
--------- ---------- ----------
        3          5          6

2.2. 結果集

DEPTNO        CNT
------ ----------
    10          3
    20          5
    30          6

2.3.   sql

select dept.deptno,
         case dept.deptno
              when 10 then emp_cnts.deptno_10
              when 20 then emp_cnts.deptno_20
              when 30 then emp_cnts.deptno_30
         end as CNT
    from (
  select sum(case when deptno=10 then 1 else 0 end) as deptno_10,
         sum(case when deptno=20 then 1 else 0 end) as deptno_20,
         sum(case when deptno=30 then 1 else 0 end) as deptno_30
    from emp
         ) emp_cnts,
         (select deptno from dept where deptno <= 30) dept

3. 變換結果集成多行

3.1. 結果集

JOB       ENAME
--------- ----------
ANALYST   SCOTT
ANALYST   FORD
CLERK     SMITH
CLERK     ADAMS
CLERK     MILLER
CLERK     JAMES
MANAGER   JONES
MANAGER   CLARK
MANAGER   BLAKE
PRESIDENT KING
SALESMAN  ALLEN
SALESMAN  MARTIN
SALESMAN  TURNER
SALESMAN  WARD

3.2. 結果集

CLERKS ANALYSTS MGRS  PREZ    SALES
------ -------- ----- ---- ------ ---------------
MILLER   FORD    CLARK      KING    TURNER
JAMES    SCOTT   BLAKE              MARTIN
ADAMS            JONES           WARD
SMITH                               ALLEN

3.3. DB2

3.4. Oracle

3.5. SQL Server

3.6. 使用視窗函數ROW_NUMBER OVER確保每一個JOB/ENAME組合都是唯一的

select max(case when job='CLERK'
                  then ename else null end) as clerks,
         max(case when job='ANALYST'
                  then ename else null end) as analysts,
         max(case when job='MANAGER'
                  then ename else null end) as mgrs,
         max(case when job='PRESIDENT'
                  then ename else null end) as prez,
         max(case when job='SALESMAN'
                  then ename else null end) as sales
    from (
  select job,
         ename,
         row_number()over(partition by job order by ename) rn
    from emp
         ) x
   group by rn

3.6.1.1. 為了剔除掉Null,需要調用聚合函數MAX,並基於RN執行GROUP BY

3.7. PostgreSQL

3.8. MySQL

3.9. sql

select max(case when job='CLERK'
                  then ename else null end) as clerks,
         max(case when job='ANALYST'
                  then ename else null end) as analysts,
         max(case when job='MANAGER'
                  then ename else null end) as mgrs,
         max(case when job='PRESIDENT'
                  then ename else null end) as prez,
         max(case when job='SALESMAN'
                  then ename else null end) as sales
    from (
  select e.job,
         e.ename,
         (select count(*) from emp d
           where e.job=d.job and e.empno < d.empno) as rnk
    from emp e
         ) x
   group by rnk

3.9.1.1. 使用標量子查詢基於EMPNO為每個員工排序

3.9.1.2. 針對標量子查詢的返回值執行GROUP BY

3.9.1.3. 使用CASE表達式和聚合函數MAX實現結果集變換

4. 反向變換結果集成一列

4.1. 把一個查詢結果合併成一列

4.1.1. 希望返回DEPTNO等於10的全體員工的ENAME、JOB和SAL,並且想把3列值合併成1列

4.2. DB2

4.3. Oracle

4.4. SQL Server

4.5. 使用視窗函數ROW_NUMBER OVER

select case rn
              when 1 then ename
              when 2 then job
              when 3 then cast(sal as char(4))
         end emps
    from (
  select e.ename,e.job,e.sal,
         row_number()over(partition by e.empno
                              order by e.empno) rn
    from emp e,
         (select *
            from emp where job='CLERK') four_rows
   where e.deptno=10
         ) x

5. 刪除重覆數據

5.1. 結果集

DEPTNO ENAME
------ ---------
    10 CLARK
       KING
       MILLER
    20 SMITH
       ADAMS
       FORD
       SCOTT
       JONES
    30 ALLEN
       BLAKE
       MARTIN
       JAMES
       TURNER
       WARD

5.1.1. 每個DEPTNO只顯示一次

5.2. DB2

5.3. SQL Server

5.4. 使用視窗函數MIN OVER

select case when empno=min_empno
              then deptno else null
         end deptno,
         ename
    from (
  select deptno,
         min(empno)over(partition by deptno) min_empno,
         empno,
         ename
    from emp
         ) x

5.5. Oracle

select to_number(
           decode(lag(deptno)over(order by deptno),
                 deptno,null,deptno)
        ) deptno, ename
   from emp

6. 變換結果集以實現跨行計算

select deptno, sum(sal) as sal
  from emp
 group by deptno
DEPTNO        SAL
------ ----------
    10       8750
    20      10875
    30       9400

6.2. 算出上述DEPTNO 20和DEPTNO 10之間的工資總額的差值,以及上述DEPTNO 20和DEPTNO 30之間的工資總額差值

  select d20_sal - d10_sal as d20_10_diff,
         d20_sal - d30_sal as d20_30_diff
    from (
  select sum(case when deptno=10 then sal end) as d10_sal,
         sum(case when deptno=20 then sal end) as d20_sal,
         sum(case when deptno=30 then sal end) as d30_sal
    from emp
         ) totals_by_dept

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 基於Avalonia 11.0.0+ReactiveUI 的跨平臺項目開發2-功能開發 ![image-20230718225201652](https://www.raokun.top/upload/2023/07/image-20230718225201652.png) **項目簡介**:目 ...
  • 在使用DevExpress的GridView的時候,我們為了方便,往往使用一些擴展函數,動態創建GridView列的編輯控制項對象,然後我們可以靈活的對內容進行編輯或者使用一些彈出的對話框窗體進行處理內容的錄入,本篇隨筆就是介紹這一主題:在DevExpress的GridView的列中,動態創建列的時候... ...
  • ## 簡介 ##### IoC Ioc控制反轉,是一種設計模式和原則,旨在解耦組件之間的依賴關係,並將對象的創建和管理委托外部容器。是面向編程中一種重要的概念,用於提高代碼的可維護性. 核心思想:通過將控制權從高層轉移到底層模塊,實現對依賴關係的控制反轉,傳統上,一個對象通常負責自己的依賴項創建和管 ...
  • 本文介紹了值類型和引用類型在編程中的區別。值類型包括簡單類型、枚舉類型和結構體類型,通常被分配線上程的堆棧上,變數保存的是實例數據本身。引用類型實例則被分配在托管堆上,變數保存的是實例數據的記憶體地址。值類型由操作系統負責管理,而引用類型則由垃圾回收機制(GC)負責管理。本文還通過示例代碼展示了值類型... ...
  • ## 一:背景 ### 1. 講故事 這篇文章源自於分析一些疑難dump的思考而產生的靈感,在dump分析中經常要尋找的一個答案就是如何找到死亡線程的生前都做了一些什麼?參考如下輸出: ``` C# 0:001> !t ThreadCount: 22 UnstartedThread: 0 Backg ...
  • 本文介紹了 C# 中委托的定義、使用、為什麼引入委托以及委托的本質。同時,還介紹了委托鏈的使用,即將多個委托鏈接在一起,提高程式的可擴展性。 ...
  • > 2023/7/20 初學內核,記錄與分享,感嘆內核學了後真的感覺很多東西都通透了,但是難度太大,只能淺淺初探。 # 前提 內核五大功能 ➢ **進程管理**:進程的創建,銷毀,調度等功能 註:可中斷,不可中斷,就是是否被信號打斷。從運行狀態怎樣改到可中斷等待態,和不可中斷等待態操作系統開始會對每 ...
  • ARP學習和老化機制在Linux網路通信中起著至關重要的作用。ARP(Address Resolution Protocol)地址解析協議是將IP地址解析為MAC地址的一種機制。本文將詳細介紹Linux中ARP學習和老化的概念、工作原理以及其重要性。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...