尝试用存储过程在mysql中创建pivot,不会添加只有空记录的列

xjreopfe  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(401)

好的,我有三个表,我正在合并来创建透视表。为简单起见,我将只引用用于此操作的字段。
员工->usertblid,firstname,lastname
lms\u培训->培训ID,培训名称
lms\uu 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表fine,但它只包含在lms\uu complete中具有关联记录的trainingname列。如果我从第2行删除内部连接或将其更改为左连接(在我看来,这不会将其限制为lms\uuuu完整条目,并为您提供lms\uuuu trainings中的所有trainingnames),则会产生旧的1064错误。
我知道这并不是让所有的培训人员都通过这个程序。我想我在第3行的左连接应该是lms\uu trainings和lms\uu complete之间的联合左连接,但是我在过去几天没有在google中输入正确的搜索参数来找到我需要的东西。

lnxxn5zx

lnxxn5zx1#

solorflare在这里给出了答案。诀窍是克服组concat\u max\u 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;

相关问题