복붙노트

[SQL] SQL - 어떻게 트랜스 하는가?

SQL

SQL - 어떻게 트랜스 하는가?

나는 다음 표와 비슷한 뭔가를 :

================================================
| Id | UserId | FieldName     | FieldValue     |
=====+========+===============+================|
| 1  | 100    | Username      | John Doe       |
|----+--------+---------------+----------------|
| 2  | 100    | Password      | pass123!       |
|----+--------+---------------+----------------|
| 3  | 102    | Username      | Jane           |
|----+--------+---------------+----------------|
| 4  | 102    | Password      | $ecret         |
|----+--------+---------------+----------------|
| 5  | 102    | Email Address | jane@email.com |
------------------------------------------------

나는 나에게이 같은 결과를 줄 것이다 쿼리를해야합니다 :

==================================================
| UserId | Username  | Password | Email Address  |
=========+===========+===========================|
| 100    | John Doe  | pass123! |                |
|--------+-----------+----------+----------------|
| 102    | Jane      | $ecret   | jane@email.com |
|--------+-----------+----------+----------------|

필드 이름의 값은 사용자 이름, 암호 및 이메일 주소에 국한되지 않습니다. 그들은 사용자가 정의하는대로 그들은 아무것도 할 수있다.

SQL이 할 수있는 방법이 있나요?

해결법

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

    1.그 휴가를 사용할 수 있도록 MySQL은, ANSI PIVOT / UNPIVOT 구문을 지원하지 않습니다

    그 휴가를 사용할 수 있도록 MySQL은, ANSI PIVOT / UNPIVOT 구문을 지원하지 않습니다

      SELECT t.userid
             MAX(CASE WHEN t.fieldname = 'Username' THEN t.fieldvalue ELSE NULL END) AS Username,
             MAX(CASE WHEN t.fieldname = 'Password' THEN t.fieldvalue ELSE NULL END) AS Password,
             MAX(CASE WHEN t.fieldname = 'Email Address' THEN t.fieldvalue ELSE NULL END) AS Email
        FROM TABLE t
    GROUP BY t.userid
    

    당신이 볼 수 있듯이, CASE 문은 값에 따라 정의 될 필요가있다. 이 역동적하려면, 당신은 MySQL을의 준비된 명령문 (동적 SQL) 구문을 사용해야 할 것입니다.

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

    2.당신은 GROUP_CONCAT를 사용할 수 있습니다

    당신은 GROUP_CONCAT를 사용할 수 있습니다

    (안된)

    SELECT UserId, 
    GROUP_CONCAT( if( fieldname = 'Username', fieldvalue, NULL ) ) AS 'Username', 
    GROUP_CONCAT( if( fieldname = 'Password', fieldvalue, NULL ) ) AS 'Password', 
    GROUP_CONCAT( if( fieldname = 'Email Address', fieldvalue, NULL ) ) AS 'Email Address', 
    FROM table  
    GROUP BY UserId
    
  3. from https://stackoverflow.com/questions/3392956/sql-how-to-transpose by cc-by-sa and MIT license