6

Pivot_table のデータの最初の図でわかるように、Table1 からデータを変換したいと思います。MySQLでそれを行うことは可能ですか? ピボットテーブル(A、B、C、D)の値はvarcharデータ形式であり、SUMなどのMySQLの集計関数を使用できないためです。

Table1:
PK        Name     Subject     Grade
-------------------------------------
1         Bob       Math        A
2         Bob       History     B
3         Bob       Language    C
4         Bob       Biology     D
5         Sue       History     C
6         Sue       Math        A
7         Sue       Music       A
8         Sue       Geography   C


Pivot_table:
Subject     Bob     Sue
-------------------------
Math        A        A
History     B        C
Language    C 
Biology     D
Music                A
Geography            C

ご協力いただきありがとうございます

4

2 に答える 2

11

静的クエリ (Bob と Sue だけに関する限り) は次のようになります。

SELECT subject, 
       MAX(CASE WHEN name = 'Bob' THEN grade END) `Bob`,
       MAX(CASE WHEN name = 'Sue' THEN grade END) `Sue` 
  FROM table1 
 GROUP BY subject

他の名前を説明できるようにするには、このような動的 SQL を使用します

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
         CONCAT('MAX(CASE WHEN name = ''', name,
                ''' THEN grade END) `', name, '`'))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                     FROM table1 
                    GROUP BY subject');

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

出力:

| | 件名 | ボブ | スー |
|--------|--------|--------|
| | 生物学 | D | (ヌル) |
| | 地理 | (ヌル) | シー |
| | 歴史 | ビ | シー |
| | 言語 | シー | (ヌル) |
| | 数学 | あ | あ |
| | 音楽 | 音楽 | (ヌル) | あ |

これがSQLFiddleのデモです


それをストアド プロシージャにラップして、呼び出し側の作業を簡素化できます。

DELIMITER $$
CREATE PROCEDURE sp_grade_report()
BEGIN
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT
           CONCAT('MAX(CASE WHEN name = ''', name,
                  ''' THEN grade END) `', name, '`'))
    INTO @sql
    FROM table1;

  SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                       FROM table1 
                      GROUP BY subject');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

使用例:

CALL sp_grade_report();

これがSQLFiddleのデモです

于 2013-09-05T06:58:23.517 に答える
0

変換用のストアド プロシージャを記述します。

  1. SELECT DISTINCT name FROM table1;Pivot_table の列のリストを取得します。件名に適切な列数 + 1 のテーブルを作成します。

  2. すべての被験者をピボット テーブルに挿入して、被験者ごとに 1 行を取得します。INSERT ... from SELECT DISTINCT subject FROM table1.

  3. table1 からすべてのレコードを取得するためのカーソルを作成します。カーソルのすべての行を調べ、各行呼び出しに対してUPDATE Pivot_table SET [COLUMN_NAME for studetn value]=[grade value] WHERE subject=[subject name value];

于 2013-09-05T06:56:46.810 に答える