Попытка создать PIVOT в MySQL с помощью хранимой процедуры не приведет к добавлению столбцов, имеющих только нулевые записи. - PullRequest
0 голосов
/ 06 июня 2018

Хорошо, у меня есть три таблицы, над которыми я работаю, чтобы создать сводную таблицу.Для простоты я буду ссылаться только на поля, которые я использую для этого.

employee-> 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, но он включает только столбцы trainingName, имеющие связанную запись в lms__complete.Если я удаляю внутреннее соединение из строки 2 или изменяю его на левое соединение (которое, по моему мнению, не ограничило бы его записями lms__complete и давало бы вам все trainingNames в lms__trainings), это выдает старую добрую ошибку 1064.

Я знаю, что это просто не отправляет все trainingID через процедуру.Я думаю, что мое ЛЕВОЕ СОЕДИНЕНИЕ в строке 3 должно быть ЛЕВЫМ СОЕДИНЕНИЕМ СОЮЗА между lms__trainings и lms__complete, но я не поместил правильные параметры поиска в Google за последние пару дней, чтобы найти то, что мне нужно.

1 Ответ

0 голосов
/ 06 июня 2018

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;
...