В приведенном ниже коде используются OUTER APPLY и функции ранжирования для достижения результата.
DECLARE @persons TABLE(Fred int,Jim int,John int)
INSERT INTO @persons
VALUES(11,21,31),(12,22,null),(13,null,null)
SELECT t.Name
, Max(CASE WHEN t.rnk = 1 THEN t.value END) AS value1
, Max(CASE WHEN t.rnk = 2 THEN t.value END) AS value2
, Max(CASE WHEN t.rnk = 3 THEN t.value END) AS value3
FROM (
SELECT Fred, Jim, John, Row_Number() OVER ( ORDER BY ( SELECT NULL)) AS rnk
FROM @persons
) AS p
OUTER APPLY (
VALUES ('Fred', Fred, rnk), ('Jim', Jim, rnk), ('John', John, rnk)
) AS t(Name, Value, rnk)
GROUP BY Name
Result Set
+------+--------+--------+--------+
| Name | value1 | value2 | value3 |
+------+--------+--------+--------+
| Fred | 11 | 12 | 13 |
| Jim | 21 | 22 | NULL |
| John | 31 | NULL | NULL |
+------+--------+--------+--------+