3

重複の可能性:
MySQLピボットテーブル

派生テーブルを使用するLEFTJOIN、派生テーブルを使用するRIGHT JOIN、別のテーブルデザインを使用する必要がありますか、それともテーブルをクエリしてPythonコードを記述し、以下に示す目的の出力を生成する必要がありますか?

私が取得したい出力は、次の出力例を生成します。

==========================
| 2005   |  2006 |  2007 |  <--- These headings are not necessary
==========================
|   A    |  A    |  A    |
--------------------------
|  AA    |  AA   |  AA   |
--------------------------
|  BB    |  BB   |       |
--------------------------
|  C     |       |   C   |
--------------------------

クエリのデータは、(記号、年)を含む2列のテーブルにあります。

====================
|  Symbol |  Year  |
====================
|   A     |  2005  |
--------------------
|   AA    |  2005  |
--------------------
|   BB    |  2005  |
--------------------
|   C     |  2005  |
--------------------
|   A     |  2006  |
--------------------
|   AA    |  2006  |
--------------------
|   BB    |  2006  |
--------------------
|   A     |  2007  |
--------------------
|   AA    |  2007  |
--------------------
|   C     |  2007  |
--------------------
4

1 に答える 1

5
SELECT MAX(CASE WHEN year = 2005 THEN Symbol ELSE NULL END) `2005`,
       MAX(CASE WHEN year = 2006 THEN Symbol ELSE NULL END) `2006`,
       MAX(CASE WHEN year = 2007 THEN Symbol ELSE NULL END) `2007`
FROM tableName
GROUP BY Symbol

年の値が不明な場合は、動的SQLクエリを使用することをお勧めします。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN year = ',
      year,
      ' THEN Symbol ELSE NULL end) AS ',
      CONCAT('`', year, '`')
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  ', @sql, ' 
                   FROM tableName 
                   GROUP BY Symbol');

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

null値の代わりに空の文字列を表示する場合は、COALESCEが必要です。

于 2012-12-24T04:13:53.063 に答える