【问题标题】:Trying to create a PIVOT in MySQL with a stored procedure, won't add columns that only have null records尝试使用存储过程在 MySQL 中创建 PIVOT,不会添加只有空记录的列
【发布时间】:2026-02-14 04:50:01
【问题描述】:

好的,我正在合并三个表来创建我的数据透视表。为简单起见,我将仅引用我为此使用的字段。

employees->userTblID, firstName, lastName

lms__trainings->trainingID,trainingName

lms__complete->completeID、trainingID、employeeID(userTblID)

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(b.trainingID = ''',F.trainingID, ''', b.completionDate, NULL)) AS ''', F.trainingName,"'")) INTO @sql FROM lms__trainings AS F INNER JOIN lms__complete AS G ON F.trainingID=G.trainingID;
SET @sql = CONCAT('SELECT a.userTblID, a.firstName, a.lastName, ', @sql, ' FROM employees AS a LEFT JOIN lms__complete AS b ON a.userTblID=b.employeeID WHERE a.cloudID=1 GROUP BY a.userTblID ORDER BY a.lastName');
PREPARE stmt FROM @sql;
EXECUTE stmt;

它可以很好地生成 PIVOT 表,但它只包含在 lms__complete 中具有关联记录的 trainingName 列。如果我从第 2 行删除内部连接或将其更改为左连接(在我看来,这不会将其限制为 lms__complete 条目并为您提供 lms__trainings 中的所有 trainingNames),它会给出很好的旧 1064 错误。

我知道它只是没有通过该程序发送所有 trainingID。我在想我在第 3 行的 LEFT JOIN 应该是 lms__trainings 和 lms__complete 之间的 UNION 的 LEFT JOIN,但我在过去几天没有在谷歌中输入正确的搜索参数来找到我需要的东西。

【问题讨论】:

  • 如果出现错误,请添加错误消息。它可以极大地帮助您识别问题。对于根据您的描述最有可能的嫌疑人,请查看here
  • 就是这样!!!不知道限制,但我将其提高到 SET SESSION group_concat_max_len = 5000;并将第二行更改为我最初想要的 LEFT JOIN,它运行良好。

标签: mysql pivot prepared-statement


【解决方案1】:

Solorflare 在这里确实给出了答案。 诀窍是克服 group_concat_max_len 的默认值。

我通过设置来做到这一点

SET SESSION group_concat_max_len = 5000;

所以我的存储过程现在看起来像

SET @sql = NULL;
SET SESSION group_concat_max_len = 5000;

SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(b.trainingID = ''',F.trainingID, ''', b.completionDate, NULL)) AS ''', F.trainingName,"'")) INTO @sql FROM lms__trainings AS F LEFT JOIN lms__complete AS G ON F.trainingID=G.trainingID;

SET @sql = CONCAT('SELECT a.userTblID, a.firstName, a.lastName, ', @sql, ' FROM employees AS a LEFT JOIN lms__complete AS b ON a.userTblID=b.employeeID WHERE a.cloudID=1 GROUP BY a.userTblID ORDER BY a.lastName');

PREPARE stmt FROM @sql;

EXECUTE stmt;

【讨论】: