欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中實現行列轉換的操作示例

 更新時間:2024年06月18日 11:28:16   作者:zxrhhm  
在 MySQL 中進行行列轉換(即,將某些列轉換為行或將某些行轉換為列)通常涉及使用條件邏輯和聚合函數,本文給大家介紹了MySQL中實現行列轉換的操作示例,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下

在 MySQL 中進行行列轉換(即,將某些列轉換為行或將某些行轉換為列)通常涉及使用條件邏輯和聚合函數。雖然 MySQL 沒有像 Oracle/SQL Server 中的 PIVOT 和 UNPIVOT 那樣的直接功能,但你可以通過結合 CASE 語句、UNION 或 UNION ALL、以及 GROUP BY 等來實現這些轉換。

1、行轉列的操作

在 MySQL 中,并沒有內置的 PIVOT 函數,如 Oracle/SQL Server 中那樣。但是,你可以使用條件聚合或 CASE 語句來模擬 PIVOT 操作。

以下是一個簡單的示例,說明如何在 MySQL 中模擬 PIVOT。

假設你有一個名為 t_sales 的表,它記錄了銷售數據,結構如下:

CREATE TABLE t_sales (  
    id int primary key auto_increment,
    col_year INT,  
    product VARCHAR(255),  
    amount DECIMAL(10, 2)  
);  
  
INSERT INTO t_sales (col_year, product, amount) VALUES  
(2020, 'A001', 100),  
(2020, 'B001', 120),  
(2021, 'A001', 150),  
(2021, 'B001', 150),
(2022, 'A001', 260),  
(2022, 'B001', 240),
(2023, 'B001', 330),
(2024, 'A001', 440);

(root@localhost:mysql.sock)[superdb 10:49:26]>select * from t_sales;
+----+----------+---------+--------+
| id | col_year | product | amount |
+----+----------+---------+--------+
|  1 |     2020 | A001    | 100.00 |
|  2 |     2020 | B001    | 120.00 |
|  3 |     2021 | A001    | 150.00 |
|  4 |     2021 | B001    | 150.00 |
|  5 |     2022 | A001    | 260.00 |
|  6 |     2022 | B001    | 240.00 |
|  7 |     2023 | B001    | 330.00 |
|  8 |     2024 | A001    | 440.00 |
+----+----------+---------+--------+
8 rows in set (0.00 sec)

現在,假設你想要將產品列 (product) 轉換為列標題,并為每個年份和產品顯示銷售額。在 Oracle/SQL Server 中,你可以使用 PIVOT 來實現這一點。但在 MySQL 中,你可以這樣做:

SELECT   
    col_year,  
    SUM(CASE WHEN product = 'A001' THEN amount ELSE 0 END) AS 'A_product',  
    SUM(CASE WHEN product = 'B001' THEN amount ELSE 0 END) AS 'B_product'  
FROM t_sales
GROUP BY col_year;

(root@localhost:mysql.sock)[superdb 10:50:29]>SELECT   
    ->     col_year,  
    ->     SUM(CASE WHEN product = 'A001' THEN amount ELSE 0 END) AS 'A_product',  
    ->     SUM(CASE WHEN product = 'B001' THEN amount ELSE 0 END) AS 'B_product'  
    -> FROM t_sales
    -> GROUP BY col_year;
    
-- 這將返回以下結果
+----------+-----------+-----------+
| col_year | A_product | B_product |
+----------+-----------+-----------+
|     2020 |    100.00 |    120.00 |
|     2021 |    150.00 |    150.00 |
|     2022 |    260.00 |    240.00 |
|     2023 |      0.00 |    330.00 |
|     2024 |    440.00 |      0.00 |
+----------+-----------+-----------+
5 rows in set (0.00 sec)

這就是在 MySQL 中模擬 PIVOT 的方法。對于更復雜的轉換或更多的產品,你可能需要擴展 CASE 語句來包含更多的條件。

2、列轉行的操作

在 MySQL 中,沒有直接的 UNPIVOT 操作,因為 UNPIVOT 是 SQL Server 和 Oracle 等數據庫系統(tǒng)中的功能,用于將多列轉換為多行。但是,你可以使用 MySQL 的查詢技巧來模擬 UNPIVOT 操作。

假設你有一個類似 PIVOT 后的結果集,并且你想要將其轉換回原始的多行格式,你可以使用 UNION ALL 或 UNION(取決于是否要消除重復行)來模擬 UNPIVOT。

以下是一個示例,說明如何在 MySQL 中模擬 UNPIVOT 操作:

假設你有一個 t_pivoted_sales 表,它是通過 PIVOT(或上述的 MySQL 模擬方法)得到的:

CREATE TABLE t_pivoted_sales (  
    id int primary key auto_increment,
    col_year INT,  
    A_product DECIMAL(18, 2),  
    B_product DECIMAL(18, 2)  
);  
  
INSERT INTO t_pivoted_sales (col_year, A_product, B_product) VALUES  
(2020, 100.00, 120.0),  
(2021, 150.00, 150.00),
(2022, 260.00, 240.00),
(2023, 0.00, 330.00),
(2024, 440.00, 0.00);

(root@localhost:mysql.sock)[superdb 11:02:54]>select * from t_pivoted_sales;
+----+----------+-----------+-----------+
| id | col_year | A_product | B_product |
+----+----------+-----------+-----------+
|  1 |     2020 |    100.00 |    120.00 |
|  2 |     2021 |    150.00 |    150.00 |
|  3 |     2022 |    260.00 |    240.00 |
|  4 |     2023 |      0.00 |    330.00 |
|  5 |     2024 |    440.00 |      0.00 |
+----+----------+-----------+-----------+
5 rows in set (0.00 sec)

現在,你想要將 A_product 和 B_product 列轉換回多行格式,其中有一個額外的列product來表示產品(A_product 或 B_product)。你可以使用以下查詢來模擬 UNPIVOT:

SELECT col_year, 'A_product' AS product, A_product AS amount FROM t_pivoted_sales
union all
SELECT col_year, 'B_product' AS product, B_product AS amount FROM t_pivoted_sales
order by col_year;

這將返回以下結果

這就是在 MySQL 中模擬 UNPIVOT 操作的方法。通過為每個你想要“unpivot”的列創(chuàng)建一個 SELECT 語句,并使用 UNION ALL 將它們組合在一起,你可以得到期望的多行格式結果。

到此這篇關于MySQL中實現行列轉換的操作示例的文章就介紹到這了,更多相關MySQL行列轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL生產庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程

    MySQL生產庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程

    這篇文章主要介紹了MySQL生產庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程,需要的朋友可以參考下
    2014-02-02
  • MySQL橫縱表相互轉化操作實現方法

    MySQL橫縱表相互轉化操作實現方法

    這篇文章主要介紹了MySQL橫縱表相互轉化操作,結合實例形式分析了MySQL橫縱表相互轉化操作基本原理、實現方法與相關注意事項,需要的朋友可以參考下
    2020-06-06
  • Nacos配置MySQL8的方法

    Nacos配置MySQL8的方法

    這篇文章主要介紹了Nacos配置MySQL8的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • MySQL中使用游標觸發(fā)器的方法

    MySQL中使用游標觸發(fā)器的方法

    這篇文章主要介紹了MySQL中使用游標-觸發(fā)器的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • mysql如何讓自增id歸0解決方案

    mysql如何讓自增id歸0解決方案

    數據庫的Id自增越來越大,要讓自增重新從1開始:那么就用下面的方法吧
    2012-11-11
  • Mysql性能優(yōu)化之索引下推

    Mysql性能優(yōu)化之索引下推

    這篇文章主要介紹了Mysql性能優(yōu)化之索引下推,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Mysql5.6啟動內存占用過高解決方案

    Mysql5.6啟動內存占用過高解決方案

    vps的內存為512M,安裝好nginx,php等啟動起來,mysql死活啟動不起來看了日志只看到對應pid被結束了,后跟蹤看發(fā)現是內存不足被killed;mysql5.6啟動內存占用過高怎么辦呢,下面小編給大家解答下
    2016-09-09
  • MySQL進階之索引

    MySQL進階之索引

    索引就是一種數據結構,這種結構類似,鏈表,樹等等。但是比它們要復雜的多,索引(index)是幫助MySQL高效獲取數據的數據結構(有序),本文詳細介紹了MySQL索引,感興趣的同學可以參考閱讀
    2023-04-04
  • 將MySQL的表數據全量導入clichhouse庫中

    將MySQL的表數據全量導入clichhouse庫中

    這篇文章主要介紹了將MySQL的表數據全量導入clichhouse庫中,詳細介紹全量導出MySQL數據到clickhouse表的相關內容,需要的小伙伴可以參考一下
    2022-03-03
  • MySQL 最基本的SQL語法/語句

    MySQL 最基本的SQL語法/語句

    MySQL 最基本的SQL語法/語句,使用mysql的朋友可以參考下。
    2011-09-09

最新評論