このタイプのデータ変換は、ピボットとして知られています。 。 MySQLにはピボット関数がないため、CASE
を使用した集計関数を使用してデータを変換する必要があります。 表現。
変換する値が事前にわかっている場合は、次のように値をハードコーディングできます。
select studentid,
sum(case when subject = 'Java' then mark else 0 end) Java,
sum(case when subject = 'C#' then mark else 0 end) `C#`,
sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
from yourtable
group by studentid
SQL Fiddle withDemo を参照してください。 。
サブジェクトの値が不明または柔軟な場合は、プリペアドステートメントを使用して動的SQLを生成することをお勧めします。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when subject = ''',
subject,
''' then mark else 0 end) AS `',
subject, '`'
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT studentid, ', @sql, '
from yourtable
group by studentid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SQL Fiddle withDemo を参照してください。 。
両方のクエリの結果は次のとおりです。
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
| 10 | 46 | 65 | 79 |
| 11 | 66 | 85 | 99 |