根據條件取消動態一組動態列

以下示例是一個非常有用的基礎,當你嘗試將事務資料轉換為未轉動的資料時,出於 BI /報告原因,其中要取消轉動的維可以具有動態的列集。

對於我們的示例,我們假設原始資料表包含標記問題形式的員工評估資料。

原始資料表如下:

create table rawdata

(
 PersonId VARCHAR(255)
,Question1Id INT(11)
,Question2Id INT(11)
,Question3Id INT(11)
)  

rawdata 表是一個臨時表,作為 ETL 過程的一部分,可以有不同數量的問題。目標是對任意數量的問題使用相同的非旋轉過程,即將要取消旋轉的列。

下面是 rawdata 表的玩具示例:

StackOverflow 文件

在 MYSQL 中使用 UNION ALL 的眾所周知的靜態方式來取消資料的轉換:

create table unpivoteddata

(

 PersonId VARCHAR(255)
,QuestionId VARCHAR(255)
,QuestionValue INT(11)

);

INSERT INTO unpivoteddata SELECT PersonId, 'Question1Id' col, Question1Id 
FROM rawdata
UNION ALL
SELECT PersonId, 'Question2Id' col, Question2Id 
FROM rawdata
UNION ALL
SELECT PersonId, 'Question3Id' col, Question3Id 
FROM rawdata; 

在我們的例子中,我們想要定義一種方法來取消任意數量的 QuestionId 列。為此,我們需要執行一個準備好的語句,它是所需列的動態選擇。為了能夠選擇需要取消旋轉的列,我們將使用 GROUP_CONCAT 語句,我們將選擇資料型別設定為 int 的列。在 GROUP_CONCAT 中,我們還包括要執行的 SELECT 語句的所有其他元素。

set @temp2 = null; 

SELECT GROUP_CONCAT(' SELECT ', 'PersonId',',','''',COLUMN_NAME,'''', ' col     ',',',COLUMN_NAME,' FROM rawdata' separator ' UNION ALL' ) FROM     INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'rawdata' AND DATA_TYPE = 'Int' INTO     @temp2;

select @temp2;

在另一種情況下,我們可以選擇列名稱與模式匹配的列,例如,而不是

DATA_TYPE = 'Int'

使用

COLUMN_NAME LIKE 'Question%'

或者可以通過 ETL 階段控制的合適的東西。

準備好的宣告最終定稿如下:

set @temp3 = null;

select concat('INSERT INTO unpivoteddata',@temp2) INTO @temp3;

select @temp3;

prepare stmt FROM @temp3;
execute stmt;
deallocate prepare stmt;

unpivoteddata 表如下:

SELECT * FROM unpivoteddata

StackOverflow 文件

根據條件選擇列然後製作預準備語句是動態取消資料轉換的有效方法。