首頁 > 資料庫 > mysql教程 > 如何使用 PIVOT 在 MySQL 中執行動態交叉表查詢?

如何使用 PIVOT 在 MySQL 中執行動態交叉表查詢?

Susan Sarandon
發布: 2025-01-06 09:30:41
原創
711 人瀏覽過

How to Perform Dynamic Crosstab Queries in MySQL Using PIVOT?

MySQL PIVOT/CROSSTAB 查詢

問題陳述:

需要將包含代表不同屬性的使用者輸入的資料的表格轉換為交叉表格式,其中每個列標題代表一個屬性,每行包含該屬性對應的使用者輸入值。此外,customer_attribute 欄位的值會套用作列標題,而不是靜態標籤。

查詢1:將資料轉換為交叉表格式

要實現所需的交叉表格式,您可以使用PIVOT 查詢如下:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS user_input',
      node_id
    )
  ) INTO @sql
FROM trn_user_log;


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

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

此查詢使用PIVOT 運算子將行轉換為列,並按app_id、transaction_id 和mobile_no 列。

查詢2:使用自訂列標題

要使用customer_attribute 列中的值作為列標題,您可以稍微修改上面的查詢:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS ',
      customer_attribute
    )
  ) INTO @sql
FROM trn_user_log;

SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

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

此修改後的查詢將靜態列標題(user_input1、user_input2 等)替換為對應的列標題customer_attribute 值。

注意:

  • 這些查詢中使用的準備好的語句可確保動態列創建,並避免在處理未知數量的列時出現潛在的語法錯誤。
  • 初始查詢中使用的 NAME_CONST 函數在這種情況下不適用,因為它需要一個常數值作為第二個參數,這對於動態列不可行一代。

以上是如何使用 PIVOT 在 MySQL 中執行動態交叉表查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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