복붙노트

[SQL] SQL 쿼리 결과에서 열 이름으로 열 값을 설정

SQL

SQL 쿼리 결과에서 열 이름으로 열 값을 설정

나는 SQL 쿼리 결과의 열 이름이 될 것입니다 값이있는 테이블을 읽고 싶었다. 예를 들어, I는 표가 ..

id    col1     col2
----------------------
0      name    ax
0      name2   bx
0      name3   cx
1      name    dx
1      name2   ex
1      name3   fx                

당신이 ID = 0이 표시되면 이름은 도끼와 NAME2 IS BX 및 NAME3 IS CX의 값을 갖습니다. 대신이되는 행은 ID, 이름, NAME2, NAME3으로 열을 표시하는 것이 더 쉽습니다. 지금은 이런 모습에 쿼리의 결과를 원하는 :

id   name    name2     name3
0    ax      bx         cx
1    dx      ex         fx

이를 달성 캔 누군가의 도움이 나를?

해결법

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

    1.이것은 피벗 테이블로 이루어집니다. ID로 그룹화, 당신은)는 MAX (같은 열 사용 뭔가 캡처 할 각 값에 대해 CASE 문을 발급 널 (null)을 제거하고 한 행 아래로 붕괴 집계.

    이것은 피벗 테이블로 이루어집니다. ID로 그룹화, 당신은)는 MAX (같은 열 사용 뭔가 캡처 할 각 값에 대해 CASE 문을 발급 널 (null)을 제거하고 한 행 아래로 붕괴 집계.

    SELECT
      id,
      /* if col1 matches the name string of this CASE, return col2, otherwise return NULL */
      /* Then, the outer MAX() aggregate will eliminate all NULLs and collapse it down to one row per id */
      MAX(CASE WHEN (col1 = 'name') THEN col2 ELSE NULL END) AS name,
      MAX(CASE WHEN (col1 = 'name2') THEN col2 ELSE NULL END) AS name2,
      MAX(CASE WHEN (col1 = 'name3') THEN col2 ELSE NULL END) AS name3
    FROM
      yourtable
    GROUP BY id
    ORDER BY id
    

    참고 :이 전용으로 작동 COL1에 사용할 수있는 값의 유한 알려진 숫자입니다. 가능한 값의 수를 알 수없는 경우, 당신은 루프에서 동적 SQL 문을 작성해야합니다.

  2. ==============================

    2.당신이 할하려는 것은 당신이 CASE 및 집계 함수를 사용하여이를 복제 할 수 있도록 PIVOT MySQL은 피벗 기능이없는 것입니다.

    당신이 할하려는 것은 당신이 CASE 및 집계 함수를 사용하여이를 복제 할 수 있도록 PIVOT MySQL은 피벗 기능이없는 것입니다.

    당신이 열 알려진 번호가있는 경우에, 당신은 정적 버전과 하드 코드 값을 사용할 수 있습니다. 이 (데모와 참조 SQL 바이올린)와 유사 :

    select id,
      max(case when col1='name' then col2 end) name,
      max(case when col1='name2' then col2 end) name2,
      max(case when col1='name3' then col2 end) name3
    from yourtable
    group by id
    

    당신이 열을 알 수없는 번호가 경우에, 당신은 준비된 문을 사용하여이 동적를 만들 수 있습니다 :

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when col1 = ''',
          col1,
          ''' then col2 end) AS ',
          col1
        )
      ) INTO @sql
    FROM yourtable;
    
    SET @sql = CONCAT('SELECT id, ', @sql, ' 
                      FROM yourtable 
                      GROUP BY id');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    데모와 SQL 바이올린을 참조하십시오

  3. ==============================

    3.

    select id,
        max(if(tablename.columnname = 'name',tablename.columnname,null)) as namealise,
        max(if(tablename.columnname = 'name1',tablename.columnname,null)) as namealise1 
    from table1, table2 
    where table1.id = table2.id 
    group by table1.id 
    order by table1.id
    
  4. from https://stackoverflow.com/questions/12808189/setting-column-values-as-column-names-in-the-sql-query-result by cc-by-sa and MIT license