明月笑刀無(wú)情
2019-08-13 10:33:19
Mysql查詢(xún)動(dòng)態(tài)地將行轉(zhuǎn)換為列MySQL可以將列轉(zhuǎn)換為行,動(dòng)態(tài)添加行所需的列數(shù)。我認(rèn)為我的問(wèn)題可能與數(shù)據(jù)透視表有關(guān),但我不確定,除了通過(guò)給出以下示例,我不知道如何構(gòu)建這個(gè)問(wèn)題。給出兩個(gè)表A和B,看起來(lái)像表A.+--+-----+----+|id|order|data|+--+-----+----+|1 |1 |P |+--+-----+----+|2 |2 |Q |+--+-----+----+|2 |1 |R |+--+-----+----+|1 |2 |S |+--+-----+----+我想編寫(xiě)一個(gè)如下所示的查詢(xún):結(jié)果表+--+-----+-----+|id|data1|data2|+--+-----+-----+|1 |P |S |+--+-----+-----+|2 |R |Q |+--+-----+-----+基本上我想將表B中的每一行轉(zhuǎn)換為結(jié)果表中的一列。如果在表B中為id = 1添加了一個(gè)新條目,那么我希望結(jié)果表自動(dòng)擴(kuò)展一列以容納這個(gè)額外的數(shù)據(jù)點(diǎn)。
2 回答

ABOUTYOU
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以使用GROUP BY
和MAX
模擬數(shù)據(jù)透視。MySQL也支持IF
聲明。
SELECT ID, MAX(IF(`order` = 1, data, NULL)) data1, MAX(IF(`order` = 2, data, NULL)) data2FROM TableAGROUP BY ID
如果您有多個(gè)值order
,則動(dòng)態(tài)SQL可能更合適,因此您不必修改查詢(xún):
SET @sql = NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`) ) INTO @sqlFROM TableName;SET @sql = CONCAT('SELECT ID, ', @sql, ' FROM TableName GROUP BY ID');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;
兩種查詢(xún)的輸出:
╔════╦═══════╦═══════╗
║ ID ║ DATA1 ║ DATA2 ║
╠════╬═══════╬═══════╣
║ 1 ║ P ║ S ║
║ 2 ║ R ║ Q ║
╚════╩═══════╩═══════╝

慕無(wú)忌1623718
TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
你需要使用MAX
和GROUP BY
模擬一個(gè)PIVOT:
SELECT Id, MAX(CASE WHEN Order = 1 THEN data END) data1, MAX(CASE WHEN Order = 2 THEN data END) data2FROM TableAGROUP BY Id
這是SQL小提琴。
添加回答
舉報(bào)
0/150
提交
取消