복붙노트

[SQL] MySQL의에서 선택 동적 열

SQL

MySQL의에서 선택 동적 열

그것은 다음과 같은 테이블을 통과 할 수 있습니다 :

mysql> select * from `stackoverflow`.`Results`;
+--------------+---------+-------------+--------+
| ID           | TYPE    | CRITERIA_ID | RESULT |
+--------------+---------+-------------+--------+
|            1 | car     | env         | 1      |
|            2 | car     | gas         |        |
|            3 | car     | age         |        |
|            4 | bike    | env         | 1      |
|            5 | bike    | gas         |        |
|            6 | bike    | age         | 1      |
|            7 | bus     | env         | 1      |
|            8 | bus     | gas         | 1      |
|            9 | bus     | age         | 1      |
+--------------+---------+-------------+--------+
9 rows in set (0.00 sec)

이 속으로 :

+------+-----+-----+-----+
| TYPE | env | gas | age |
+------+-----+-----+-----+
| car  | 1   |     |     |
| bike | 1   |     | 1   |
| bus  | 1   | 1   | 1   |
+------+-----+-----+-----+

목표는 모든 CRITERIA_IDs를 선택하고 열로 사용하는 것입니다. 행으로 내가 모든 유형을 사용하는 것을 좋아합니다.

그러나보기 또는 떨어지게로 결합하는 방법. 이 같은?

당신은 데이터를 재생하고자합니다. 이 테이블을 생성하는 스크립트입니다 :

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 );

해결법

  1. ==============================

    1.불행하게도 MySQL은 기본적으로 당신이하려고하는 어떤 피벗 기능이 없습니다. 당신은 CASE 문으로 집계 함수를 사용해야합니다 그래서 :

    불행하게도 MySQL은 기본적으로 당신이하려고하는 어떤 피벗 기능이 없습니다. 당신은 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 바이올린을 참조하십시오

    당신은 당신이 시간을 앞서 트랜스에 열을 모르는 의미,이 동적으로 수행하려는 경우 지금, 당신은 다음 문서를 검토해야합니다 :

    동적 피벗 테이블 (컬럼에 로우 변환)

    코드는 다음과 같을 것이다 :

    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 바이올린을 참조하십시오

  2. from https://stackoverflow.com/questions/11899647/select-dynamic-columns-in-mysql by cc-by-sa and MIT license