3 回答

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊
雖然@John的靜態(tài)答案很好用,但是如果您要轉(zhuǎn)換的列數(shù)未知,我會考慮使用準(zhǔn)備好的語句來獲取結(jié)果:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'GROUP_CONCAT((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;
參見帶有演示的SQL Fiddle
至于您的第二個,請說清楚您要做什么。

TA貢獻(xiàn)1802條經(jīng)驗 獲得超4個贊
對于我正在執(zhí)行的任務(wù),這是一個非常有用的問題。我繼續(xù)修改了@bluefin的解決方案,以解決您的第二個問題。以下代碼生成您最初請求的格式,其值Customer_attribute作為交叉表中的結(jié)果列標(biāo)題。
相關(guān)的更改是更改:
' then entered_value else NULL END)) AS user_input',
node_id
對此:
' then entered_value else NULL END)) AS ''',
customer_attribute,''''
完整代碼:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'GROUP_CONCAT((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;
另外,對于瀏覽此問題的其他用戶,如果您有很多試圖交叉制表的值,則可能會出錯,因為GROUP_CONCAT()的默認(rèn)最大長度為1024個字符。為了增加這一點(diǎn),請將其放在準(zhǔn)備好的語句的開頭:
SET SESSION group_concat_max_len = value; -- replace value with an int
添加回答
舉報