3

以下は私のテーブル構造であり、それを別の形式に変換したい(行から列タイプへ)私は非常に試しましたが、そうすることができません。

StudentID | Mark | Subject
-------------------------
10        |46    |Java
--------------------------
10        |65    |C#
--------------------------
10        |79    |JavaScript
---------------------------
11        |66    |Java
--------------------------
11        |85    |C#
--------------------------
11        |99    |JavaScript
--------------------------

O/P は次のようになります。

StudentID | Java | C# | JavaScript
---------------------------------
10        |  46  | 65 |   79
---------------------------------
11        |  66  | 85 |  99
-------------------------------
4

1 に答える 1

5

このタイプのデータ変換は、ピボットと呼ばれます。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 with Demoを参照してください。

サブジェクトの値が不明または柔軟な場合は、準備済みステートメントを使用して動的 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 with Demoを参照してください。

両方のクエリの結果は次のとおりです。

| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
|        10 |   46 | 65 |         79 |
|        11 |   66 | 85 |         99 |
于 2013-01-14T11:35:10.690 に答える