PIVOT 两列并保持其他列不变

PIVOT two columns and keep others as they are

我想将一些行变成列,同时保持其他行不变。

ID      name     value     RefId
1       Fname    John      32145
2       LName    Smith     32145
3       Fname    Peter     34589
4       LName    Mahlang   34589

现在我想要实现的是将 FnameLname 行转换为具有匹配的 value 字段的列。 ID专栏并不重要,我不需要。

期望输出

       Fname     Lname     RefId
       John      Smith     32145
       Peter     Mahlang   34589

任何帮助

使用条件聚合:

select 
    Fname = max(case when name = 'Fname' then value end)
  , Lname = max(case when name = 'Lname' then value end)
  , RefId
from t
group by RefId

rextester 演示:http://rextester.com/MRMY11592

returns:

+---------+---------+-------+
|  Fname  |  Lname  | RefId |
+---------+---------+-------+
| John    | Smith   | 32145 |
| Peter   | Mahlang | 34589 |
+---------+---------+-------+

或使用pivot()

select 
    Fname
  , Lname
  , RefId
from (select name, value, refid from t) s
pivot(max(value) for name in ([Fname],[Lname]))p