首頁 > 資料庫 > mysql教程 > 如何根據多個條件動態地將 MySQL 中的行轉換為列?

如何根據多個條件動態地將 MySQL 中的行轉換為列?

Mary-Kate Olsen
發布: 2025-01-05 12:44:42
原創
1038 人瀏覽過

How to Dynamically Pivot Rows to Columns in MySQL Based on Multiple Criteria?

在MySQL 中動態地將行轉換為具有多個條件的列

問題:

如何我根據兩個條件動態地將MySQL 中的行轉換為列,由兩個表示列?

上下文:

表格包含多行,每行包含名為「資料」和「價格」的欄位。目標是將表格轉換為新表格,其中的欄位代表資料和價格的唯一組合,每個儲存格包含對應的行資料。

解:

為了根據多個條件動態地將行轉換為列,我們可以結合使用 MySQL函數與動態SQL.

  1. 逆透視資料:

首先,我們逆透視原始表,為每個唯一的資料組合建立一個包含多行的新表格和價格。

SELECT id, CONCAT('order', `order`) AS col, data AS value
FROM tableA
UNION ALL
SELECT id, CONCAT('item', item) AS col, price AS value
FROM tableA;
登入後複製
  1. 樞軸資料:

接下來,我們使用 CASE 語句將未透視的資料聚合回列中。

SELECT id, 
MAX(CASE WHEN col = 'order1' THEN value END) AS order1,
MAX(CASE WHEN col = 'order2' THEN value END) AS order2,
MAX(CASE WHEN col = 'order3' THEN value END) AS order3,
MAX(CASE WHEN col = 'item1' THEN value END) AS item1,
MAX(CASE WHEN col = 'item2' THEN value END) AS item2,
MAX(CASE WHEN col = 'item3' THEN value END) AS item3
FROM (
  SELECT id, CONCAT('order', `order`) AS col, data AS value
  FROM tableA
  UNION ALL
  SELECT id, CONCAT('item', item) AS col, price AS value
  FROM tableA
) d
GROUP BY id;
登入後複製
  1. 動態SQL:

為了使查詢動態化,我們使用準備好的語句並動態產生基於原始表中唯一列的CASE 語句。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN col = ''',
      col,
      ''' THEN value END) AS `', 
      col, '`')
  ) INTO @sql
FROM (
  SELECT CONCAT('order', `order`) AS col
  FROM tableA
  UNION ALL
  SELECT CONCAT('item', `item`) AS col
  FROM tableA
) d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  FROM (
                    SELECT id, CONCAT(''order'', `order`) AS col,  data AS value
                    FROM tableA
                    UNION ALL
                    SELECT id, CONCAT(''item'', item) AS col, price AS value
                    FROM tableA
                  ) d
                  GROUP BY id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
登入後複製

此動態查詢處理任意數量的唯一條件並產生所需的轉換表。

以上是如何根據多個條件動態地將 MySQL 中的行轉換為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板