0

3 つの列 (SID、SUBJECT、MARKS) を持つテーブルがあります。

╔══════╦═════════╦═══════╗
║ SID  ║ SUBJECT ║ MARKS ║
╠══════╬═════════╬═══════╣
║ 1A01 ║ ENG     ║    66 ║
║ 1A02 ║ ENG     ║    75 ║
║ 1A01 ║ MATH    ║    60 ║
║ 1A03 ║ ENG     ║    73 ║
║ 1A02 ║ MATH    ║    35 ║
║ 1A03 ║ MATH    ║    80 ║
║ 1A01 ║ CHI     ║    65 ║
║ 1A02 ║ CHI     ║    74 ║
║ 1A03 ║ CHI     ║    78 ║
╚══════╩═════════╩═══════╝

そして、次のように、各行の SID でデータをグループ化したいと考えています。

╔══════╦═════╦═════╦══════╗
║ SID  ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║  65 ║  66 ║   60 ║
║ 1A02 ║  74 ║  75 ║   35 ║
║ 1A03 ║  78 ║  73 ║   80 ║
╚══════╩═════╩═════╩══════╝

私はmysqlの初心者です。サブクエリとUNIONを使用しようとしましたが、失敗しました。誰かヒントを教えてください。

4

1 に答える 1

5

これらの 3 つだけが対象である場合は、 を使用してfor everyCASEをテストし、を使用して結果を集計できます。SubjectSIDMAX()

SELECT  SID,
        MAX(CASE WHEN Subject = 'Chi' THEN Marks ELSE NULL END) `Chi`,
        MAX(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) `Eng`,
        MAX(CASE WHEN Subject = 'Math' THEN Marks ELSE NULL END) `Math`
FROM    TableName
GROUP   BY SID

ただし、サブジェクトの数が不明な場合は、使用する動的 SQLPREPAREがはるかに優先されます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN Subject = ''',
      Subject,
      ''' then Marks end) AS ',
      CONCAT('`', Subject,'`')
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  SID, ', @sql, ' 
                    FROM    TableName
                    GROUP   BY SID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

両方のクエリからの出力

╔══════╦═════╦═════╦══════╗
║ SID  ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║  65 ║  66 ║   60 ║
║ 1A02 ║  74 ║  75 ║   35 ║
║ 1A03 ║  78 ║  73 ║   80 ║
╚══════╩═════╩═════╩══════╝
于 2013-04-01T12:50:18.487 に答える