Two part question:
In producing a cross tab results in MySql, the
Distinct
call doesn't seem to be working... or I'm missing something else? I'm getting the sameClassName
in several columns. i.e. "MDC (intro)".: Existing example in SQLFiddle produces results (although not correct), however when moved to hosted MySql it fails with error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'el FROM EnrollmentsTblx GROUP BY AutoNum' at line 1
SQL:
SET @sql = NULL;
SELECT
GROUP_CONCAT(
DISTINCT
CONCAT(
' GROUP_CONCAT((CASE ClassName when ', CHAR(39),
ClassName, CHAR(39),
' then ', CHAR(39), DateCompleted, CHAR(39), ' else NULL END)) AS `',
ClassName, '`'
)
) INTO @sql
FROM EnrollmentsTbl;
SET @sql = CONCAT('SELECT AutoNum, UserName, ', @sql, '
FROM EnrollmentsTbl
GROUP BY AutoNum, UserName');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Schems:
SET NAMES 'UTF8';
CREATE TABLE `EnrollmentsTbl` (
`AutoNum` INTEGER PRIMARY KEY,
`UserName` VARCHAR(50),
`SubmitTime` DATETIME,
`ClassName` VARCHAR(50),
`ClassDate` DATETIME,
`ClassTime` VARCHAR(50),
`Enrolled` BOOLEAN,
`WaitListed` BOOLEAN,
`Instructor` VARCHAR(50),
`DateCompleted` DATETIME,
`Completed` BOOLEAN,
`EnrollmentsMisc` VARCHAR(50),
`Walkin` BOOLEAN
) CHARACTER SET 'UTF8';
INSERT INTO `EnrollmentsTbl`(`AutoNum`,`UserName`,`SubmitTime`,`ClassName`,`ClassDate`,`ClassTime`,`Enrolled`,`WaitListed`,`Instructor`,`DateCompleted`,`Completed`,`EnrollmentsMisc`,`Walkin`)
VALUES(1,'John',NULL,'MDC (Intro)','2004-06-27 00:00:00',NULL,TRUE,FALSE,'Phil','2004-06-27 00:00:00',TRUE,NULL,FALSE),
(2,'Bob',NULL,'MDC (Intro)','2004-06-27 00:00:00',NULL,TRUE,FALSE,'Phil','2004-06-27 00:00:00',TRUE,NULL,FALSE),
(3,'Robert',NULL,'MDC (Intro)','2004-06-27 00:00:00',NULL,TRUE,FALSE,'Phil','2004-06-27 00:00:00',TRUE,NULL,FALSE),
(4,'John','2010-08-04 06:11:10','HIPAA (Employee)','2010-08-04 00:00:00','6:12 AM',TRUE,FALSE,'On-line','2010-08-04 06:11:10',TRUE,NULL,FALSE),
(5,'Debbie',NULL,'MDC (Intro)','2003-04-19 14:53:55',NULL,TRUE,FALSE,'devore','2003-04-19 14:53:55',TRUE,NULL,FALSE),
(6,'Jeff',NULL,'MDC (Intro)','2003-03-29 14:26:23',NULL,TRUE,FALSE,'','2003-03-29 14:26:23',TRUE,NULL,FALSE),
(7,'Tom',NULL,'Firehouse (Incident)','2004-07-13 00:00:00',NULL,TRUE,FALSE,'Shannon','2004-07-13 00:00:00',TRUE,NULL,FALSE),
(8,'Janet','2016-06-30 14:02:05','MDC (On-Line)','2016-06-30 00:00:00','2:02 PM',TRUE,FALSE,'On-line','2016-06-30 14:02:05',TRUE,NULL,FALSE);
Fiddle Screen Shot:
I have this working in an Access DB as SQL:
TRANSFORM DateCompleted
SELECT UserName
FROM EnrollmentsTbl
GROUP BY UserName
ORDER BY UserName
PIVOT ClassName
The desired results look something like this:
UserName MDC (Intro) HIPAA (Employee) Firehouse (Incident)
-------- ----------- ---------------- --------------------
John 6-27-2004 10-4-2006 8-6-2005
Bob 6-27-2004
Robert 6-27-2004 8-6-2005
Debbie 4-19-2003
Jeff 11-25-2006
Tom 7-13-2004
Janet 11-25-2006