T-SQL : select table 列名派生自字段名称列 (PIVOT, CASE)

T-SQL : select table with columnames derived from fieldName column (PIVOT, CASE)

我正在努力在 T-SQL 中编写一个 select 语句,该语句生成一个 table 列名代表源 table 列的值(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|

结果table

|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。名字是随机生成的,所以任何对真人的引用纯属巧合。

我建议使用条件聚合来转换这个实体属性值 table:

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

如果您想尝试 PIVOT

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