SQL Server не разрешает несколько столбцов

Я пытаюсь повернуть вокруг него несколько столбцов, чтобы получить до 3 столбцов (свод, имя столбца, значение)

так, например:

name  |  age  |  gender
------+-------+---------
John  |   20  |    M
Jill  |   21  |    F

станет:

name | column | value
-----+--------+-------
John |  age   |   20
John | gender |   M
Jill |  age   |   21
Jill | gender |   F

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

Ответ 1

Преобразование столбцов в строки называется UNPIVOT. Вы не указали, какую версию SQL Server используете, но есть несколько способов получить результат.

Вы можете использовать SELECT с UNION ALL:

SELECT name, 'age' as column, cast(age as varchar(10)) as value
FROM yourtable
UNION ALL
SELECT name, 'gender' as column, gender as value
FROM yourtable;

Если вы используете SQL Server 2005+, вы можете использовать функцию UNPIVOT:

SELECT name, column, age
FROM
(
  SELECT 
    name, 
    age = cast(age as varchar(10)), 
    gender
  FROM yourtable
) d
UNPIVOT
(
  value
  for column in (age, gender)
) unpiv;

Наконец, вместо функции UNPIVOT вы также можете использовать CROSS APPLY с помощью VALUES (2008+) или UNION ALL:

SELECT name, column, age
FROM yourtable
CROSS APPLY
(
  VALUES
    ('age', cast(age as varchar(10)),
    ('gender', gender)
) c (column, value);

Любая из этих версий даст вам результат, который вы хотите. Вы заметите, что мне нужно было расставить столбец age в varchar. Это связано с тем, что тип данных/длина (в univot) столбцов должны быть одинаковыми, поскольку вы преобразуете их в один столбец в конечном результате.

Ответ 2

SELECT name, column, value
FROM (SELECT name, age, gender
FROM table) src
UNPIVOT (value FOR column IN (age, gender)) pvt