2016-07-01 17 views
0

MySQLクエリからクロスタブの結果を返すための小さな助けを探して、私は過去にMS AccessとPivotのテーブルを正常に動作させました。私はMySQLに移行しており、同じ結果を得る必要があります。私はmysql pivot/crosstab queryが私が達成しようとしているものですが、私のテーブルにエラーがあるようです。 (アウトSO例のエラーでSQLFiddleへのリンク)MySQL CrossTabの結果

SET SESSION group_concat_max_len = 10000; 
SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     ' GROUP_CONCAT((CASE Class_Name when ', CHAR(39), 
     ClassName, CHAR(39), 
     ' then ', CHAR(39), DateCompleted, CHAR(39), ' else NULL END)) AS  Completed', 
     ClassName 
    ) 
) INTO @sql 
FROM EnrollmentsTbl; 

スキーマ:

ここ
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,'Rhonda',NULL,'Firehouse (Incident)','2004-07-13 00:00:00',NULL,TRUE,FALSE,'arobe','2004-07-13 00:00:00',TRUE,NULL,FALSE), 
    (9,'Jeff',NULL,'Firehouse (Incident)','2004-07-13 00:00:00',NULL,TRUE,FALSE,'arobe','2004-07-13 00:00:00',TRUE,NULL,FALSE), 
    (10,'Patrick',NULL,'Firehouse (Incident)','2004-07-13 00:00:00',NULL,TRUE,FALSE,'arobe','2004-07-13 00:00:00',TRUE,NULL,FALSE), 
    (11,'Donnie',NULL,'Firehouse (Incident)','2004-07-10 00:00:00',NULL,TRUE,FALSE,'feiertag','2004-07-10 00:00:00',TRUE,NULL,FALSE), 
    (12,'Andy',NULL,'Firehouse (EMS)','2004-07-10 00:00:00',NULL,TRUE,FALSE,'feiertag','2004-07-10 00:00:00',TRUE,NULL,FALSE), 
    (13,'Brian',NULL,'Firehouse (Incident)','2004-07-17 00:00:00',NULL,TRUE,FALSE,'Paul','2004-07-17 00:00:00',TRUE,NULL,FALSE), 
    (14,'Jane',NULL,'Firehouse (EMS)','2004-07-17 00:00:00',NULL,TRUE,FALSE,'Paul','2004-07-17 00:00:00',TRUE,NULL,FALSE), 
    (15,'Richard',NULL,'Firehouse (EMS)','2004-07-17 00:00:00',NULL,TRUE,FALSE,'Paul','2004-07-17 00:00:00',TRUE,NULL,FALSE), 
    (16,'Dale',NULL,'Firehouse (EMS)','2004-07-17 00:00:00',NULL,TRUE,FALSE,'Paul','2004-07-17 00:00:00',TRUE,NULL,FALSE), 
    (17,'Stinky','2016-06-29 17:17:19','FireApp (Assessment Only)','2016-07-18 00:00:00','1830',TRUE,FALSE,NULL,NULL,FALSE,NULL,FALSE), 
    (18,'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); 

失敗した私のSQLFiddle例です。http://sqlfiddle.com/#!9/0c4c2/3

UPDATE:ここ が返さ@sqlでは、とエラー: @SELECT AutoNum, UserName, GROUP_CONCAT((CASE Class_Name when 'MDC (Intro)' then '2004-06-27 00:00:00'else NULL END)) AS CompletedMDC (Intro), GROUP_CONCAT((CASE Class_Name when 'HIPAA (Employee)' then '2010-08-04 06:11:10'else NULL END)) AS CompletedHIPAA (Employee), GROUP_CONCAT((CASE Class_Name when 'MDC (Intro)' then '2003-04-19 14:53:55'else NULL END)) AS CompletedMDC (Intro), GROUP_CONCAT((CASE Class_Name when 'MDC (Intro)' then '2003-03-29 14:26:23'else NULL END)) AS CompletedMDC (Intro), GROUP_CONCAT((CASE Class_Name when 'Firehouse (Incident)' then '2004-07-13 00:00:00'else NULL END)) AS CompletedFirehouse (Incident), GROUP_CONCAT((CASE Class_Name when 'MDC (On-Line)' then '2016-06-30 14:02:05'else NULL END)) AS CompletedMDC (On-Line) FROM enrollmentstbl GROUP BY AutoNum, UserName

Record Count: 1; Execution Time: 1ms View Execution Plan link 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 '(Intro), GROUP_CONCAT((CASE Class_Name when 'HIPAA (Employee)' then '2010-08-04 ' at line 1

答えて

1

リンクされたトピックで評価されるフィールドは数値(node_id)ですが、あなたの場合はテキスト(classname)です。しかし、あなたのコードでは、このフィールドの値を一重引用符または二重引用符で囲まないので、MySQLは実際にそれらを解釈できません。したがって、エラーメッセージです。

sqlにchar(39)呼び出しを追加して、group_concat()呼び出しを作成しました。 Char(39)はアポストロフィ(一重引用符)です。残念ながら、今動作しているかどうかを確認するためにsqlfiddleにアクセスすることはできません。しかし、select @sqlコマンドを実行してから@sqlから準備済みの文を作成しようとすると、結果のSQL文を自分で確認してテストできます。

2回目にクラス名を一重引用符で囲む必要がある場合もあります。

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'GROUP_CONCAT((CASE Class_Name when ', CHAR(39), 
     ClassName, CHAR(39), 
     ' then DateCompleted else NULL END)) AS Completed', 
     ClassName 
    ) 
) INTO @sql 
FROM EnrollmentsTbl; 

UPDATEは

第二の問題は、あなたのクラス名のフィールド値は、括弧などのスペースや他の非従来型の文字を、含まれており、これらがあなたのフィールド名の別名で大混乱を果たしていることです。

たとえば、あなたはSQLで次の別名があります。

...AS CompletedHIPAA (Employee)... 

をあなたが動作するようにバッククォート文字( `)で、このようなエイリアスを囲む必要があります含めるように

...`AS CompletedHIPAA (Employee)`... 

変更したSQL backticks:

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'GROUP_CONCAT((CASE Class_Name when ', CHAR(39), 
     ClassName, CHAR(39), 
     ' then DateCompleted else NULL END)) AS `Completed', 
     ClassName,'`' 
    ) 
) INTO @sql 
FROM EnrollmentsTbl; 
+0

SQLFiddleがヒットするか見逃しているようです。私はあなたの修正をphpMyAdminで実行し、次のエラーが発生しました:MySQLは言った: #1064 - SQL構文に誤りがあります。 'GROUP_CONCAT((' CASE Class_Name 'MDC(Intro)'、次にDateCompleted else NULL EN 'が1行目のときに使用する正しい構文についてはMySQLサーバのバージョンに対応するマニュアルをチェックしてください。 – BarclayVision

+0

準備コマンドの前に@sqlをエコーすることで、一連のクエリによって生成されたSQL文全体をコピーします.Sqlコマンド全体を見ることなく、何が間違っているのかは分かりません。クラス名は二重引用符で囲みます。 – Shadow

+0

まだ取得中:#1064 - SQL構文に誤りがあります。 'GROUP_CONCAT(' GROUP_CONCAT((CASE Class_Name、 '、' 2行目の場合 - 準備コマンドの前に@sqlをエコーすることがわからない場合) – BarclayVision