programing

SQL - 전치 방법은?

jooyons 2023. 10. 7. 10:44
반응형

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 |
|--------+-----------+----------+----------------|

FieldName의 값은 사용자 이름, 암호 및 전자 메일 주소로 제한되지 않습니다.이들은 사용자가 정의한 대로 무엇이든 될 수 있습니다.

SQL에서 이것을 할 수 있는 방법이 있습니까?

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의 준비된 문(dynamic SQL) 구문을 사용해야 합니다.

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

언급URL : https://stackoverflow.com/questions/3392956/sql-how-to-transpose

반응형