T- SQL: выберите таблицу с названиями столбцов, полученными из столбца fieldName (PIVOT, CASE) - PullRequest
1 голос
/ 10 апреля 2020

Я борюсь с составлением оператора select в T- SQL, который генерирует таблицу, имена столбцов которой представляют значение столбца исходной таблицы (FieldName) и записи со значениями, которые находятся в столбце ( FieldValue) и сгруппированы по внешнему ключу (RegistrationId).

Я нашел много примеров с похожими проблемами, и я удивлен, что не смог найти правильное решение, так как мне кажется, очень распространенная ситуация.

|RegistrationID    |FieldName|FieldValue             |
+------------------+---------+-----------------------+
|Guid1             |firstname|john                   |
|Guid1             |lastname |johnson                |
|Guid1             |email    |john.johnson@mail.com  |
|Guid2             |firstname|mary                   | 
|Guid2             |lastname |williams               |
|Guid2             |email    |mary.williams@mail.com |
|Guid3             |firstname|james                  |
|Guid3             |lastname |miller                 |
|Guid3             |email    |james.miller@mail.com  |
|Guid4             |firstname|patricia               |
|Guid4             |lastname |jones                  |
|Guid4             |email    |patricia.jones@mail.com|

Результирующая таблица

|RegistrationID    |firstname|lastname          |email                   |
+------------------+---------+------------------+------------------------+
|Guid1             |john     |johnson           |john.johnson@mail.com   |
|Guid2             |mary     |williams          |mary.williams@mail.com  |
|Guid3             |james    |miller            |james.miller@mail.com   |
|Guid4             |patricia |jones             |patricia.jones@mail.com |

Я пытался использовать операторы сводок и падежей, но результат был далеко не удовлетворительным.

Любое руководство высоко ценится

PS. имена генерируются случайным образом, поэтому любая ссылка на реальных людей является случайным совпадением.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Я бы предложил использовать условное агрегирование для поворота этой таблицы значений атрибутов сущности:

select
    registrationID,
    max(case when fieldName = 'firstname' then fieldValue end) firstname,
    max(case when fieldName = 'lastname'  then fieldValue end) lastname,
    max(case when fieldName = 'email'     then fieldValue end) email
from mytable
group by registrationID
0 голосов
/ 10 апреля 2020

Если вы хотите попробовать PIVOT

Select *
 From  YourTable src
 Pivot (max(FieldValue) for FieldName in ([FirstName],[LastName],[Email])) pv
...