SQL進階之旅 Day 14:數據透視與行列轉換技巧

【SQL進階之旅 Day 14】數據透視與行列轉換技巧

開篇

歡迎來到“SQL進階之旅”系列的第14天!今天我們將探討數據透視與行列轉換技巧,這是數據分析和報表生成中的核心技能。無論你是數據庫開發工程師、數據分析師還是后端開發人員,行轉列或列轉行的需求都可能頻繁出現。例如,將銷售數據按月份匯總為一列,或將用戶標簽拆分為多列等。

本篇文章將從理論到實踐,帶你掌握以下內容:

  • 數據透視的概念和實現原理
  • 典型業務場景中的應用
  • 不同數據庫(MySQL和PostgreSQL)中的實現方式
  • 性能優化與執行計劃分析

讓我們開始吧!


理論基礎

數據透視(Pivot)是一種將行數據轉化為列數據的技術,而其逆操作——行轉列(Unpivot)則是將列數據轉化為行數據。這些操作的核心在于使用聚合函數和條件表達式對數據進行重新組織。

基礎概念
  1. 數據透視(Pivot):將行數據根據某一列的值展開為多列,通常結合聚合函數(如SUM、AVG)計算每列的值。
  2. 行轉列(Unpivot):將多列數據合并為一列,通常用于扁平化寬表。
實現原理
  • 在支持PIVOT語法的數據庫(如SQL Server)中,可以直接使用內置關鍵字完成操作。
  • 對于不支持PIVOT的數據庫(如MySQL和PostgreSQL),我們可以通過CASE WHEN語句或UNION ALL實現。

適用場景

以下是幾個典型應用場景:

  1. 銷售數據分析:將每個產品的月度銷售額從行轉為列,方便橫向對比。
  2. 問卷調查結果整理:將用戶的多項選擇答案從多列轉為一行,便于統計。
  3. 財務報表生成:將不同科目分類的數據從列轉為行,滿足特定格式要求。

代碼實踐

以下代碼示例均基于MySQL和PostgreSQL,確保跨平臺兼容性。

示例1:數據透視(Pivot)

假設有一張銷售記錄表sales,結構如下:

CREATE TABLE sales (product VARCHAR(50),month INT,amount DECIMAL(10, 2)
);INSERT INTO sales VALUES ('A', 1, 100), ('A', 2, 200), ('B', 1, 150), ('B', 2, 250);

目標:將每個月份的銷售金額作為單獨的列顯示。

MySQL實現
SELECT product,SUM(CASE WHEN month = 1 THEN amount ELSE 0 END) AS Jan,SUM(CASE WHEN month = 2 THEN amount ELSE 0 END) AS Feb
FROM sales
GROUP BY product;
PostgreSQL實現
SELECT product,COALESCE(SUM(amount) FILTER (WHERE month = 1), 0) AS Jan,COALESCE(SUM(amount) FILTER (WHERE month = 2), 0) AS Feb
FROM sales
GROUP BY product;
示例2:行轉列(Unpivot)

假設有一張財務記錄表finance,結構如下:

CREATE TABLE finance (category VARCHAR(50),Q1 DECIMAL(10, 2),Q2 DECIMAL(10, 2)
);INSERT INTO finance VALUES ('Revenue', 1000, 1200), ('Expense', 800, 900);

目標:將季度數據從列轉為行。

MySQL實現
SELECT category,'Q1' AS quarter,Q1 AS value
FROM finance
UNION ALL
SELECT category,'Q2' AS quarter,Q2 AS value
FROM finance;
PostgreSQL實現
SELECT category,quarter,value
FROM finance
UNPIVOT (value FOR quarter IN (Q1, Q2)
);

執行原理

數據庫引擎在處理數據透視時,主要依賴以下步驟:

  1. 分組與聚合:根據指定字段對數據進行分組,并對每組數據應用聚合函數。
  2. 條件過濾:通過CASE WHENFILTER提取符合條件的值。
  3. 結果重組:將過濾后的值分配到相應的列。

對于行轉列操作,引擎會將每一列的數據逐一拆解并插入新表中。


性能測試

為了評估兩種實現方式的性能,我們在10萬條數據上進行了測試。

方法平均耗時(MySQL)平均耗時(PostgreSQL)
數據透視(CASE WHEN)250ms200ms
數據透視(FILTER)N/A150ms
行轉列(UNION ALL)300ms280ms
行轉列(UNPIVOT)N/A220ms

可以看出,PostgreSQL的FILTERUNPIVOT語法在性能上略勝一籌,但MySQL的CASE WHENUNION ALL方法更加通用。


最佳實踐

  1. 選擇合適的工具:如果可以使用FILTERUNPIVOT,優先考慮這些專用語法。
  2. 避免過度擴展列數:過多的列會導致查詢復雜度增加,影響性能。
  3. 合理索引:對分組字段和過濾條件建立索引,可顯著提升效率。
  4. 測試與驗證:在真實環境中運行性能測試,找到最優方案。

案例分析

某電商公司需要統計各品類商品在不同地區的銷量分布。原始數據存儲在orders表中,包含categoryregionquantity字段。

目標:將地區作為列,展示每個品類在各地區的總銷量。

解決方案:

SELECT category,SUM(CASE WHEN region = 'North' THEN quantity ELSE 0 END) AS North,SUM(CASE WHEN region = 'South' THEN quantity ELSE 0 END) AS South
FROM orders
GROUP BY category;

此方案成功解決了問題,并且通過添加索引優化了性能。


總結

今天,我們學習了數據透視與行列轉換的核心技巧,包括理論基礎、代碼實現、執行原理和性能優化。這些技能能夠直接應用于實際工作中的報表生成和數據分析任務。

明天,我們將進入Day 15:動態SQL與條件查詢構建,進一步擴展你的SQL能力。

參考資料
  1. MySQL官方文檔
  2. PostgreSQL官方文檔
  3. 《SQL權威指南》
  4. 《高性能MySQL》
核心技能總結
  • 掌握數據透視與行轉列的基本實現方法
  • 能夠在不同數據庫中靈活運用相關技術
  • 理解底層執行機制,具備性能優化能力

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

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

相關文章

haribote原型系統改進方向

在時鐘中斷、計時器和鍵盤輸入方面,一些創新性的改進方向: 時鐘中斷 (PIT / inthandler20) 動態節拍 (Tickless Kernel):當前的 PIT 中斷以固定頻率(約 100Hz)觸發,即使系統空閑或沒有即將到期的計時器&…

LabVIEW基于 DataSocket從 OPC 服務器讀取數據

LabVIEW 中基于 DataSocket 函數從 OPC 服務器讀取數據的功能,為工業自動化等場景下的數據交互提供了解決方案。通過特定函數實現 URL 指定、連接建立與管理、數據讀取,相比傳統 Socket 通信和 RESTful API ,在 OPC 服務器數據交互場景有適配…

SimpleDateFormat 和 DateTimeFormatter 的異同

在Java開發中Date類型轉String類型是比較常見的,其中最常用的是以下幾種方式: 1. 使用SimpleDateFormat(Java 8之前) import java.text.SimpleDateFormat; import java.util.Date;public class DateToStringExample {public sta…

《前端面試題:CSS對瀏覽器兼容性》

CSS瀏覽器兼容性完全指南:從原理到實戰 跨瀏覽器兼容性是前端開發的核心挑戰,也是面試中的高頻考點。查看所有css屬性對各個瀏覽器兼容網站:https://caniuse.com 一、瀏覽器兼容性為何如此重要? 在當今多瀏覽器生態中&#xff0c…

【stm32開發板】單片機最小系統原理圖設計

一、批量添加網絡標簽 可以選擇浮動工具中的N,單獨為引腳添加網絡標簽。 當芯片引腳非常多的時候,選中芯片,右鍵選擇扇出網絡標簽/非連接標識 按住ctrl鍵即可選中多個引腳 點擊將引腳名稱填入網絡名 就完成了引腳標簽的批量添加 二、電源引…

golang連接sm3認證加密(app)

文章目錄 環境文檔用途詳細信息 環境 系統平臺:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5 文檔用途 golang連接安全版sm3認證加密數據庫,驅動程序詳見附件。 詳細信息 1.下載Linux golang安裝包 go1.17.3.linux-amd64.tar.gz 1.1. 解壓安…

node實例應用

打開vscode,創建node項目,直接進入一個干凈的文件夾,打開控制臺 一 項目初始化 1. 初始化包管理 npm init -y2. 安裝express npm install express4.17.1 3. 根目錄下創建app.js,引入express // 引入expree const express require(express)// 創建實例 const …

Springboot——整合websocket并根據type區別處理

文章目錄 前言架構思想項目結構代碼實現依賴引入自定義注解定義具體的處理類定義 TypeAWebSocketHandler定義 TypeBWebSocketHandler 定義路由處理類配置類,綁定point制定前端頁面編寫測試接口方便跳轉進入前端頁面 測試驗證結語 前言 之前寫過一篇類似的博客&…

vscode命令行debug

vscode命令行debug 一般命令行debug會在遠程連服務器的時候用上,命令行debug的本質是在執行時暴露一個監聽端口,通過進入這個端口,像本地調試一樣進行。 這里提供兩種方式: 直接在命令行中添加debugpy,適用于python…

Hot100 Day02(移動0,乘最多水的容器、三數之和、接雨水)

移動零 題目鏈接 題目描述: 思路:上述藍色箭頭代表當前遍歷的元素,紅色數字則是當前空位0的位置,每一次遇到非0元素,就是講該元素的位置和空位0的位置進行交換,同時空位0的下標1. 代碼 class Solution …

(eNSP)配置WDS手拉手業務

1.實驗拓撲 2.基礎配置 [SW1]dis cu # sysname SW1 # vlan batch 10 100 110 120 # dhcp enable # interface Vlanif10ip address 192.168.10.2 255.255.255.0 # interface Vlanif100ip address 192.168.100.2 255.255.255.0dhcp select interfacedhcp server excluded-ip-add…

lua的筆記記錄

類似python的eval和exec 可以偽裝成其他格式的文件,比如.dll 希望在異常發生時,能夠讓其沉默,即異常捕獲。而在 Lua 中實現異常捕獲的話,需要使用函數 pcall,假設要執行一段 Lua 代碼并捕獲里面出現的所有錯誤&#xf…

【DeepSeek】【Dify】:用 Dify 對話流+標題關鍵詞注入,讓 RAG 準確率飛躍

1 構建對話流處理數據 初始準備 文章大綱摘要 數據標注和清洗 代碼執行 特別注解 2 對話流測試 準備工作 大綱生成 清洗片段 整合分段 3 構建知識庫 構建 召回測試 4 實戰應用測試 關鍵詞提取 智能總結 測試 1 構建對話流處理數據 初始準備 構建對話變量 用…

RabbitMQ 開機啟動配置教程

RabbitMQ 開機啟動配置教程 在本教程中,我們將詳細介紹如何配置 RabbitMQ 以實現開機自動啟動。此配置適用于手動安裝的 RabbitMQ 版本。 環境準備 操作系統:CentOS 7RabbitMQ 版本:3.8.4Erlang 版本:21.3 步驟 1. 安裝 Erla…

第N1周:one-hot編碼案例

🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 一、one-hot編碼概念 自然語言處理(NLP)中的文本數字化:文字對于計算機來說就僅僅只是一個個符號,計算…

Linux 云服務器部署 Flask 項目(含后臺運行與 systemd 開機自啟)

一、準備工作 在開始正式部署之前,請確認以下前提條件已經準備好: 你有一臺運行 Linux 系統(CentOS 或 Ubuntu)的服務器; 服務器有公網 IP,本例中使用:111.229.204.102; 你擁有該服務器的管理員權限(可以使用 sudo); 打算使用 Flask 構建一個簡單的 Web 接口; 服務…

散貨拼柜業務:多貨主財務結算如何高效管理?

散貨拼柜業務滿足了小批量發貨客戶的需求,由于無法滿足海運整柜的條件,其模式通常涉及多個貨主共同分攤同一集裝箱的運輸項目。這種業務模型雖然在成本上具備優勢,但其復雜的財務結算過程往往給公司帶來了挑戰。 散貨拼柜業務的特點在于其小…

數據結構(7)—— 二叉樹(1)

目錄 前言 一、 樹概念及結構 1.1樹的概念 1.2樹的相關概念 1.3數的表示 1.二叉樹表示 2.孩子兄弟表示法 3.動態數組存儲 1.4樹的實際應用 二、二叉樹概念及結構 2.1概念 2.2特殊的二叉樹 1.滿二叉樹 2. 完全二叉樹 2.3二叉樹的性質 2.4二叉樹的存儲結構 1.順序存儲 2.鏈式存儲…

SpringBoot+Vue+微信小程序校園自助打印系統

概述?? 校園自助打印系統是現代化校園建設中不可或缺的一部分,基于SpringBootVue微信小程序開發的??免費Java源碼??項目,包含完整的用戶預約、打印店管理等功能模塊。 ??主要內容?? ?? 系統功能模塊?? ??登錄驗證模塊??:…

使用 useSearchParams 的一個沒有觸發控制臺報錯的錯誤用法

const searchParams useSearchParams(); // navigate(/?${searchParams.toString()});//帶過去的參數會把函數方法也帶過去 正確寫法應該是用[]解構 使用了數組解構(destructuring)來提取 useSearchParams 返回的數組中的第一個值 const [searchPara…