5

次のようにテーブルをトラバースすることは可能ですか:

mysql> select * from `stackoverflow`.`Results`;
+--------------------+---------+-------------+--------+
| | ID | タイプ | CRITERIA_ID | 結果 |
+--------------------+---------+-------------+--------+
| | 1 | 車 | 環境 | 1 |
| | 2 | 車 | ガス | | |
| | 3 | 車 | 年齢 | | |
| | 4 | 自転車 | 環境 | 1 |
| | 5 | 自転車 | ガス | | |
| | 6 | 自転車 | 年齢 | 1 |
| | 7 | バス | 環境 | 1 |
| | 8 | バス | ガス | 1 |
| | 9 | バス | 年齢 | 1 |
+--------------------+---------+-------------+--------+
セットで 9 行 (0.00 秒)

これに:

+-----+-----+-----+-----+
| | タイプ | 環境 | ガス | 年齢 |
+-----+-----+-----+-----+
| | 車 | 1 | | | | |
| | 自転車 | 1 | | | 1 |
| | バス | 1 | 1 | 1 |
+-----+-----+-----+-----+

目的は、すべての を選択し、CRITERIA_IDそれらを列として使用することです。TYPE行として、すべてのsを使用するのが好きです。

  • すべての基準:SELECT distinct(CRITERIA_ID) FROM stackoverflow.Results;
  • いろんなタイプSELECT distinct(TYPE) FROM stackoverflow.Results;

しかし、それらをどのように組み合わせてビューまたはsmthにしますか。このような?

データで遊ぶのが好きなら。これは、テーブルを生成するスクリプトです。

CREATE SCHEMA `stackoverflow`;
CREATE TABLE `stackoverflow`.`Results` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `TYPE` varchar(50) NOT NULL,
  `CRITERIA_ID` varchar(5) NOT NULL,
  `RESULT` bit(1) NOT NULL,
  PRIMARY KEY (`ID`)
) 
ENGINE=InnoDB;

INSERT INTO `stackoverflow`.`Results`
(
 `ID`,
 `TYPE`,
 `CRITERIA_ID`,
 `RESULT`
)
VALUES
( 1, "car", env, true ),
( 2, "car", gas, false ),
( 3, "car", age, false ),
( 4, "bike", env, true ),
( 5, "bike", gas, false ),
( 6, "bike", age, true ),
( 7, "bus", env, true ),
( 8, "bus", gas, true ),
( 9, "bus", age, true );
4

1 に答える 1

12

残念ながら、MySQLPIVOTには基本的に実行しようとしている機能がありません。CASEしたがって、次のステートメントで集計関数を使用する必要があります。

SELECT type,
  sum(case when criteria_id = 'env' then result end) env,
  sum(case when criteria_id = 'gas' then result end) gas,
  sum(case when criteria_id = 'age' then result end) age
FROM results
group by type

デモで SQL Fiddle を参照してください

これを動的に実行する場合、つまり転置する列が事前にわからない場合は、次の記事を確認する必要があります。

動的ピボット テーブル (行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(CRITERIA_ID = ''',
      CRITERIA_ID,
      ''', RESULT, NULL)) AS ',
      CRITERIA_ID
    )
  ) INTO @sql
FROM
  Results;
SET @sql = CONCAT('SELECT type, ', @sql, ' FROM Results GROUP BY type');

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

デモで SQL Fiddle を参照してください

于 2012-08-10T10:33:14.170 に答える