3 回答
TA贡献1854条经验 获得超8个赞
虽然@John的静态答案很好用,但是如果您要转换的列数未知,我会考虑使用准备好的语句来获取结果:
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贡献1802条经验 获得超4个赞
对于我正在执行的任务,这是一个非常有用的问题。我继续修改了@bluefin的解决方案,以解决您的第二个问题。以下代码生成您最初请求的格式,其值Customer_attribute作为交叉表中的结果列标题。
相关的更改是更改:
' 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()的默认最大长度为1024个字符。为了增加这一点,请将其放在准备好的语句的开头:
SET SESSION group_concat_max_len = value; -- replace value with an int
添加回答
举报