SQL - Как транспонировать? - PullRequest
20 голосов
/ 03 августа 2010

У меня есть что-то похожее на следующую таблицу:

================================================
| 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?

Ответы [ 2 ]

37 голосов
/ 03 августа 2010

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

1 голос
/ 03 августа 2010

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...