成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

行轉(zhuǎn)列不再復(fù)雜:SQL高手都在用的技巧揭秘

數(shù)據(jù)庫 其他數(shù)據(jù)庫
將冗長的縱向數(shù)據(jù)“壓縮”為橫向結(jié)構(gòu),讓分析更高效。本文將通過實戰(zhàn)案例,手把手教你掌握 SQL 中行轉(zhuǎn)列的3 種核心方法,并揭示高手的隱藏技巧。

在數(shù)據(jù)世界中,數(shù)據(jù)的“形狀”往往決定分析的效率。例如:

  • 原始數(shù)據(jù):季度銷售額按行排列,難以直接生成年度對比報表。
  • 目標:將季度(Q1-Q4)轉(zhuǎn)換為列,直觀展示全年趨勢。

這就是行轉(zhuǎn)列(Pivot)的核心價值——將冗長的縱向數(shù)據(jù)“壓縮”為橫向結(jié)構(gòu),讓分析更高效。本文將通過實戰(zhàn)案例,手把手教你掌握 SQL 中行轉(zhuǎn)列的3 種核心方法,并揭示高手的隱藏技巧

一、行轉(zhuǎn)列原理:從行到列的數(shù)學(xué)邏輯

問題場景:假設(shè)有一張銷售表 sales

year

quarter

revenue

2023

Q1

5000

2023

Q2

7000

2023

Q3

6000

2023

Q4

8000

目標:將季度(Q1-Q4)轉(zhuǎn)換為列,輸出:

year

Q1

Q2

Q3

Q4

2023

5000

7000

6000

8000

核心邏輯

  1. 分組聚合:按年份分組,計算每個季度的銷售額。
  2. 列名固定:將季度值(Q1-Q4)作為新列名。
  3. 條件判斷:通過條件表達式(如CASE WHEN)將行數(shù)據(jù)映射到對應(yīng)列。

前置 SQL:

CREATE TABLE`sales`  (
`year`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL,
`quarter`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL,
`revenue`varchar(255) CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULLDEFAULTNULL
) ENGINE = InnoDBCHARACTERSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;


INSERTINTO`sales`VALUES ('2023', 'Q2', '7000');
INSERTINTO`sales`VALUES ('2023', 'Q3', '6000');
INSERTINTO`sales`VALUES ('2023', 'Q4', '8000');
INSERTINTO`sales`VALUES ('2023', 'Q1', '5000');

二、方法詳解:3 種行轉(zhuǎn)列實戰(zhàn)技巧

方法 1:經(jīng)典 CASE WHEN(通用版)

適用場景:所有 SQL 數(shù)據(jù)庫(MySQL、PostgreSQL、SQL Server 等)。代碼示例

SELECT
  year,
SUM(CASEWHENquarter = 'Q1'THEN revenue ELSE0END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue ELSE0END) AS Q2,
SUM(CASEWHENquarter = 'Q3'THEN revenue ELSE0END) AS Q3,
SUM(CASEWHENquarter = 'Q4'THEN revenue ELSE0END) AS Q4
FROM sales
GROUPBYyear;

關(guān)鍵點

  • CASE WHEN:為每個季度創(chuàng)建條件判斷,將符合條件的值匯總到對應(yīng)列。
  • SUM():聚合非目標季度的值為 0,確保結(jié)果僅包含目標列的值。
  • GROUP BY:按年份分組,生成每行的年度匯總。

優(yōu)勢

  • 兼容性:所有 SQL 數(shù)據(jù)庫支持。
  • 可控性:可靈活調(diào)整列名和聚合方式(如MAX()AVG())。

方法 2:PIVOT 語句(簡潔版)

適用場景:SQL Server、Oracle、Snowflake 等支持PIVOT的數(shù)據(jù)庫。代碼示例

SELECT *
FROM sales
PIVOT (
  SUM(revenue)
  FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4')
) AS pivot_table;

關(guān)鍵點

  • PIVOT:直接指定要轉(zhuǎn)換的列(quarter)和目標列值(Q1-Q4)。
  • 自動聚合SUM()會自動對每個季度的revenue求和。

優(yōu)勢

  • 簡潔性:代碼行數(shù)減少 60%。
  • 可讀性:邏輯更直觀。

局限性

  • 不支持動態(tài)列:列名必須預(yù)先定義(如 Q1-Q4)。
  • 兼容性:部分數(shù)據(jù)庫(如 MySQL)不支持PIVOT

方法 3:動態(tài)列生成(進階版)

適用場景:列名未知或動態(tài)變化(如 quarter )。實現(xiàn)思路

  1. 獲取所有唯一列值:從數(shù)據(jù)中提取可能的列名。
  2. 動態(tài)生成 SQL 語句:通過應(yīng)用程序或存儲過程拼接CASE WHEN條件。

示例(MySql)

-- 1. 獲取所有列名
SET @cols = NULL;
SELECTGROUP_CONCAT(DISTINCTCONCAT('SUM(CASE WHEN quarter = ''', quarter, ''' THEN revenue END) AS ', quarter))
INTO @cols
FROM sales;

-- 2. 拼接完整SQL語句
SET @sql = CONCAT(
'SELECT year, ', @cols,
' FROM sales
   GROUP BY year'
);

-- 3. 執(zhí)行動態(tài)SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATEPREPARE stmt;

優(yōu)勢

  • 動態(tài)適應(yīng):列名無需硬編碼,適合未知或變化的列。

三、實戰(zhàn)案例:復(fù)雜場景下的行轉(zhuǎn)列

案例 1:多維度聚合(年+季度+產(chǎn)品)

需求:按年份和產(chǎn)品類型,統(tǒng)計各季度銷售額。原始數(shù)據(jù)

year

product

quarter

revenue

2023

A

Q1

3000

2023

A

Q2

4000

2023

B

Q1

2000

2023

B

Q2

3000

SQL 代碼(CASE WHEN)

SELECT
  year,
  product,
SUM(CASEWHENquarter = 'Q1'THEN revenue ELSE0END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue ELSE0END) AS Q2
FROM sales
GROUPBYyear, product;

輸出

year

product

Q1

Q2

2023

A

3000

4000

2023

B

2000

3000


案例 2:非數(shù)值型數(shù)據(jù)轉(zhuǎn)列

需求:統(tǒng)計不同地區(qū)的用戶注冊渠道(渠道為文本列)。原始數(shù)據(jù)

region

channel

count

北京

線上

150

北京

線下

100

上海

線上

200

SQL 代碼(PIVOT)

SELECT region, [線上], [線下]
FROM (
  SELECT region, channel, count
  FROM user_registration
) AS src
PIVOT (
  SUM(count)
  FOR channel IN ([線上], [線下])
) AS pvt;

輸出

region

線上

線下

北京

150

100

上海

200

NULL

四、性能優(yōu)化與常見問題

1. 性能優(yōu)化技巧

  • 索引優(yōu)化:在quarteryear等分組列上建立索引。
  • 避免全表掃描:使用WHERE子句過濾無關(guān)數(shù)據(jù)。
  • 列數(shù)控制:減少轉(zhuǎn)列的數(shù)量(如僅轉(zhuǎn) Q1-Q4,而非所有月份)。

2. 常見問題解決

  • NULL 值處理
-- 替換NULL為0
COALESCE(SUM(...), 0) AS column_name
  • 列名沖突:使用AS關(guān)鍵字重命名列(如AS [Q1_Sales])。

五、進階技巧

結(jié)合窗口函數(shù)

在轉(zhuǎn)列前,先通過窗口函數(shù)計算累計值:

SELECT
  year,
SUM(CASEWHENquarter = 'Q1'THEN revenue END) AS Q1,
SUM(CASEWHENquarter = 'Q2'THEN revenue END) AS Q2,
SUM(CASEWHENquarter = 'Q3'THEN revenue END) AS Q3,
SUM(CASEWHENquarter = 'Q4'THEN revenue END) AS Q4,
-- 計算累計值
SUM(revenue) OVER (PARTITIONBYyearORDERBYquarter) AS cumulative
FROM sales
GROUPBYyear, quarter;

總結(jié)

方法

適用場景

代碼復(fù)雜度

兼容性

CASE WHEN

全平臺通用,動態(tài)列適配

所有數(shù)據(jù)庫

PIVOT

簡潔高效,列名固定

SQL Server 等

動態(tài) SQL 生成

列名未知或動態(tài)變化

需程序支持


責(zé)任編輯:武曉燕 來源: 程序員wayn
相關(guān)推薦

2024-10-16 21:17:59

2021-11-08 23:08:06

SQL Serve數(shù)據(jù)庫開發(fā)

2021-06-23 10:13:00

SQL行轉(zhuǎn)列列轉(zhuǎn)行

2021-12-16 22:59:21

SQL報表應(yīng)用

2020-12-08 14:44:55

網(wǎng)站軟件學(xué)習(xí)

2024-08-21 08:43:53

Python技巧鍵值

2010-07-28 09:09:55

SQL

2018-09-01 08:30:43

自媒體運營工具

2024-09-23 10:00:00

代碼Python

2023-09-04 13:55:44

分支masterhotfix

2010-07-13 16:07:26

SQL Server行

2020-06-28 09:42:03

開發(fā)者技能工具

2010-07-13 16:20:30

SQL Server數(shù)

2024-11-14 09:42:32

2021-09-27 09:14:40

B端設(shè)計師走查神器

2015-11-13 10:38:53

Github系統(tǒng)內(nèi)部開源軟件

2023-02-14 06:40:33

React HookReact

2013-06-13 08:57:47

Web開發(fā)Web工具Web訪談

2022-06-14 08:59:19

PythonerpdfkitPython

2023-09-14 10:48:58

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩电影一区二区三区 | 日韩一区二区在线视频 | 国产男女视频 | 亚洲国产精品一区二区www | 国产精品久久久久久久久久久久久久 | 亚洲精品美女视频 | 日韩成人专区 | 免费的黄色片子 | 久久久www成人免费无遮挡大片 | 国产精品综合久久 | 亚洲色图网址 | 亚洲精品一区中文字幕乱码 | 狠狠狠色丁香婷婷综合久久五月 | 国产在线观看一区二区三区 | 久久精品a级毛片 | 99精品亚洲国产精品久久不卡 | 秋霞精品| 中文字幕不卡在线观看 | 午夜a v电影| 一级黄色av电影 | 日本在线一区二区三区 | 青娱乐自拍 | 四虎影院欧美 | 久久99精品国产自在现线小黄鸭 | 一区二区三区免费 | 国产欧美一区二区在线观看 | 91精品国产92 | 日韩一区二区av | 国产成人免费视频网站高清观看视频 | 久久久www成人免费精品 | 欧洲精品一区 | 亚洲a在线观看 | 久久久久精 | 久久久久久久一区 | 在线观看中文字幕视频 | 日韩欧美在线视频 | 欧美一区二不卡视频 | 亚洲国产精品成人 | 99热这里都是精品 | 午夜欧美一区二区三区在线播放 | 午夜精品久久久久久久久久久久久 |