公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL 行轉列:數據重塑的藝術

admin
2024年8月31日 9:48 本文熱度 1050

導讀

在數據庫操作中,有時我們需要將數據從行的格式轉換為列的格式,這種操作被稱為“行轉列”或“旋轉數據”。行轉列的需求在報表生成、數據分析等場景中非常常見。這篇文章將詳細介紹如何在 SQL 中實現行轉列操作,并通過示例代碼進行說明。

什么是行轉列

行轉列指的是將數據庫表中的行數據轉換為列數據的過程。例如,假設我們有如下的表結構和數據:

CREATE TABLE Sales (
    Year INT,
    Quarter VARCHAR(10),
    Amount DECIMAL(102)
);

INSERT INTO Sales (YearQuarter, Amount) VALUES
(2023'Q1'1000.00),
(2023'Q2'1500.00),
(2023'Q3'1200.00),
(2023'Q4'1800.00);

表 Sales 存儲了不同季度的銷售額。如果我們希望將這些數據轉換為按季度展開的形式,使每個季度的數據都作為單獨的一列顯示,則需要進行行轉列操作。目標表結構如下:

YearQ1Q2Q3Q4
20231000.001500.001200.001800.00

行轉列的常見方法

在 MySQL 中,行轉列操作可以通過以下幾種方法實現:

1. 使用條件聚合(CASE WHEN + 聚合函數)

這種方法是最常見且最兼容的方式,通過CASE WHEN語句和聚合函數(如SUMMAX等)來實現行轉列。

示例:

SELECT
    Year,
    SUM(CASE WHEN Quarter = 'Q1' THEN Amount ELSE 0 ENDAS Q1,
    SUM(CASE WHEN Quarter = 'Q2' THEN Amount ELSE 0 ENDAS Q2,
    SUM(CASE WHEN Quarter = 'Q3' THEN Amount ELSE 0 ENDAS Q3,
    SUM(CASE WHEN Quarter = 'Q4' THEN Amount ELSE 0 ENDAS Q4
FROM
    Sales
GROUP BY
    Year;

適用場景: 條件聚合方法適用于需要對不同條件的數據進行聚合的場景,適用所有 SQL 數據庫。

2. 使用動態 SQL 生成行轉列查詢

對于列的數量不確定或在運行時動態生成時,可以使用動態 SQL 來生成行轉列查詢。

示例:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN Quarter = ''',
      Quarter,
      ''' THEN Amount ELSE 0 END) AS `',
      Quarter'`'
    )
  ) INTO @sql
FROM Sales;

SET @sql = CONCAT('SELECT Year, ', @sql' FROM Sales GROUP BY Year');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

適用場景: 動態 SQL 適用于列名不固定,或需要動態生成列名的場景。注意,這種方法較復雜,且 SQL 注入風險需要特別注意。

3. 使用 IF 函數

類似于CASE WHENIF函數可以用于簡單的行轉列操作。

示例:

SELECT
    Year,
    SUM(IF(Quarter = 'Q1', Amount, 0)) AS Q1,
    SUM(IF(Quarter = 'Q2', Amount, 0)) AS Q2,
    SUM(IF(Quarter = 'Q3', Amount, 0)) AS Q3,
    SUM(IF(Quarter = 'Q4', Amount, 0)) AS Q4
FROM
    Sales
GROUP BY
    Year;

適用場景: IF函數語法較簡潔,適用于條件較少且不復雜的行轉列操作。

4. 使用 GROUP_CONCAT 與 SUBSTRING_INDEX(簡單字符串拼接方式)

對于某些簡單的場景,可以通過GROUP_CONCATSUBSTRING_INDEX函數將多行拼接成一列,但這種方法更適合小規模數據且無法嚴格控制數據類型。

示例:

SELECT
    Year,
    GROUP_CONCAT(Quarter':', Amount ORDER BY Quarter ASC SEPARATOR ', 'AS QuarterAmounts
FROM
    Sales
GROUP BY
    Year;

結果示例:

YearQuarterAmounts
2023Q1:1000.00, Q2:1500.00, ...

適用場景: 適用于快速將多行內容拼接為一列字符串展示的場景,但不適合嚴格的數據分析任務。

5. 使用 JOIN 自連接

在行轉列時,也可以通過多次自連接來實現,但這種方法只適用于行轉列項較少的情況。

示例:

SELECT
    t1.Year,
    t1.Amount AS Q1,
    t2.Amount AS Q2,
    t3.Amount AS Q3,
    t4.Amount AS Q4
FROM
    Sales t1
    LEFT JOIN Sales t2 ON t1.Year = t2.Year AND t2.Quarter = 'Q2'
    LEFT JOIN Sales t3 ON t1.Year = t3.Year AND t3.Quarter = 'Q3'
    LEFT JOIN Sales t4 ON t1.Year = t4.Year AND t4.Quarter = 'Q4'
WHERE
    t1.Quarter = 'Q1';

適用場景: 自連接適用于列轉換的數量不多且數據規模較小時。隨著列數的增加,這種方法的查詢復雜度和效率問題也會增加。

6. 使用PIVOT關鍵字

在 SQL Server 中,可以使用 PIVOT 關鍵字來簡化行轉列操作。

語法結構:

SELECT 
    Year
    [Q1], 
    [Q2], 
    [Q3], 
    [Q4]
FROM 
    (SELECT YearQuarter, Amount FROM Sales) AS SourceTable
PIVOT 
    (MAX(Amount) FOR Quarter IN ([Q1], [Q2], [Q3], [Q4])) AS PivotTable;

PIVOT 是一種更加直觀的方式,特別是在需要轉列的字段較多時,可以大大簡化查詢語句。

結語

行轉列是 SQL 中一項非常有用的技能,它能夠幫助我們以更加直觀的方式展示和分析數據。通過上述方法,您可以根據自己的需求靈活地進行行轉列操作。當然,在實際應用中,還需要考慮性能和維護性等因素。


該文章在 2024/9/4 18:03:06 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 丰满熟妇啪啪软件 | 国产一区二区三区精品在线观看 | 国产精品无码av片 | 国产丝袜足交在线观看 | 白丝护士高潮喷水免费网站 | av无码专区亚洲avl在线观看 | 1024国产精品一区在线观看 | 国产尤物精 | 国产午夜精品一区二区 | 91国内精品久久久久怡红院 | 99久久精品| 超超碰免费超超碰免费 | 2025年b站大全入口地址 | 国产成人免费高清视频在线观看 | 精品国产福利在线 | 国产三级精品在线观 | 国产日韩欧美动漫自拍区制服 | a级毛片高清免费视频在线播放 | 国产成人精品第一区二区三区 | 成人女人女片免费播 | 国产成人av一区二区三区在线观看 | 国产一卡2卡3卡4卡公司 | 国产精品伦视频 | 国产av一区不卡麻豆 | 精品国产一区二区三区久久久蜜桃 | 国产v综合v亚洲欧美大另类 | 国产毛片高清 | 国产亚洲欧美在线 | 国产福利一区二区麻豆 | 国产成人啪精品视频免费网站 | 91精品国产色综合久久不 | 精品无码一区二区三区土豆 | 18处破外女出血视频在线观看 | 99久久精品免费看国产情侣 | 东京热一区二区三区精品无 | 岛国无码av不 | 国产午夜无码喷水福利在线观看 | 国产丝袜| 国产毛片午夜无码专区喷水 | 国产a级综合区毛片久久国产精品 | 国模一区二区三区 |