あなたが達成しようとしていることはPIVOT
、行データを別々の列に「ing」することと呼ばれ、MySQLではサポートされていない機能ですが、ピボットしたいデータの範囲を事前に知っていれば、それを偽造することができます列に。
いくつかのオプションがあります。
この例では、組み合わせごとにA、B、およびCがあります。の値がA、B、またはCのみであると仮定すると、次のように各値に対して条件付き集計を実行できます。course
userid -> module
course
SELECT userid,
module,
MAX(CASE course WHEN 'A' THEN total END) AS A,
MAX(CASE course WHEN 'B' THEN total END) AS B,
MAX(CASE course WHEN 'C' THEN total END) AS C,
SUM(total) AS grade
FROM tbl
GROUP BY userid,
module
CASE
必要な数の集計を追加できます( D、E、Fなど)。たとえば、 forの行が含まれていない場合、一部の列のuserid -> module
組み合わせによっては、一部の列に含まれる可能性があることに注意してください。NULL
C
course
ただし、値の範囲が事前にわからない場合(および、に数百の異なる値が存在する可能性があるcourse
場合でも、すべてのデータを1つの行に取得できますが、個別の列には含まれません。実際には1つになります。単一の列に連結された文字列。これは、次を使用して実行されますGROUP_CONCAT()
。
SELECT userid,
module,
GROUP_CONCAT(CONCAT(course, ': ', total) SEPARATOR ' / ') AS coursetotals,
SUM(total) AS grade
FROM tbl
GROUP BY userid,
module
そして、これが行うことは、次のような出力です。
userid | module | coursetotals | grade
-------------------------------------------------------------
8 | BioPhysics | A: 117 / B: 74 / C: 135 | 326
編集:あなたのコメントと編集に従って、ここに新しい解決策があります:
SELECT
a.userid,
a.module,
CONCAT('Course ', course, ': ', total) AS Courses,
b.grade
FROM
tbl a
INNER JOIN
(
SELECT userid, module, SUM(total) AS grade
FROM tbl
GROUP BY userid, module
) b ON a.userid = b.userid AND a.module = b.module