2

重複の可能性:
mysqlピボット/クロス集計クエリ

MySQLとPHPを使用していますが、JOINクエリからこのテーブルを取得しています......

╔═══════╦════════════════╦═══════════════╦════════╗
║ name  ║    last_name   ║ course_name   ║ tries  ║
╠═══════╬════════════════╬═══════════════╬════════╣
║ coco  ║ valencia       ║ Course Num. 1 ║     11 ║
║ coco  ║ valencia       ║ Course Num. 2 ║     10 ║
║ coco  ║ valencia       ║ Course Num. 3 ║      4 ║
║ coco  ║ valencia       ║ Course Num. 4 ║      5 ║
║ John  ║ Smith          ║ Course Num. 1 ║      7 ║
║ John  ║ Smith          ║ Course Num. 2 ║      6 ║
╚═══════╩════════════════╩═══════════════╩════════╝

そして、私は私のテーブルの結果をこのようにしたいと思います......

╔═══════╦═══════════╦══════════════╦═══════════════╦═══════════════╗
║ name  ║ last_name ║ Course Num.1 ║ Course Num. 2 ║ Course Num. 3 ║
╠═══════╬═══════════╬══════════════╬═══════════════╬═══════════════╣
║ coco  ║ valencia  ║           11 ║            10 ║             4 ║
║ John  ║ Smith     ║            7 ║             6 ║               ║
╚═══════╩═══════════╩══════════════╩═══════════════╩═══════════════╝

私は探していましたが、それを行う方法を見つけることができません。解決策は、PHPまたはMySQL、あるいはその両方である可能性があります。

4

1 に答える 1

2
SELECT  name, last_Name,
        MAX(CASE WHEN course_name = 'Course Num. 1' THEN tries ELSE NULL END) `Course Num. 1`,
        MAX(CASE WHEN course_name = 'Course Num. 2' THEN tries ELSE NULL END) `Course Num. 2`,
        MAX(CASE WHEN course_name = 'Course Num. 3' THEN tries ELSE NULL END) `Course Num. 3`
FROM    tableName
GROUP BY name, last_Name

不明な数の場合Course_NamePreparedStatementが必要です。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN course_name =  ''',
      course_name,
      ''' then tries ELSE NULL end) AS ''',
      course_name, ''''
    )
  ) INTO @sql
FROM tableName;

SET @sql = CONCAT('SELECT  name, last_Name, ', @sql, ' 
                   FROM    tableName
                   GROUP BY name, last_Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2012-11-27T01:55:33.630 に答える