Сводные столбцы в строки в SQL Server - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть запрос, который возвращает всю строку, и мне нужно преобразовать этот результат в новую таблицу.

SELECT id_no, stud_name, group_no, class_1, class_2, class_3, class_4 FROM tbl_stud_class

Это возвращает следующее:

| id_no | stud_name | group_no | class_1 | class_2 | class_3 | class 4 |
| 1     | John Doe  | A11      | 84      | 60      | 80      | 79      |

Мне нужноиметь возможность вернуть эту строку как:

| id_no | stud_name | group_no | class   | grade |
| 1     | John Doe  | A11      | class_1 | 84    |
| 1     | John Doe  | A11      | class_2 | 60    |
| 1     | John Doe  | A11      | class_3 | 80    |
| 1     | John Doe  | A11      | class_4 | 79    |

Может кто-нибудь указать мне способ сделать это, пожалуйста?Я конвертирую свою функцию PostgreSQL (где я использую CROSS JOIN LATERAL для SQL Server)

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы можете использовать UNPIVOT , чтобы сделать это в SQL Server.Ниже приведен пример использования данных вашего образца.

CREATE TABLE #tbl_stud_class
(
    id_no int,
    stud_name varchar(50),
    group_no varchar(50),
    class_1 int,
    class_2 int,
    class_3 int,
    class_4 int
)

INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

SELECT * 
FROM #tbl_stud_class
UNPIVOT
(
    Class FOR Classes IN (class_1, class_2, class_3, class_4)
) AS UP

DROP TABLE #tbl_stud_class
0 голосов
/ 13 ноября 2018

Просто еще один вариант использования CROSS APPLY

* ** 1003 тысяча два * Пример
Select A.id_no
      ,A.stud_name
      ,A.group_no
      ,B.*
 From  YourTable A
 Cross Apply ( values ('class_1',class_1)
                     ,('class_2',class_2)
                     ,('class_3',class_3)
                     ,('class_4',class_4)
              ) B(class,grade)

Returns

id_no   stud_name   group_no    class       grade
1       John Doe    A11         class_1     84
1       John Doe    A11         class_2     60
1       John Doe    A11         class_3     80
1       John Doe    A11         class_4     79
0 голосов
/ 13 ноября 2018

На основании вашего примера я бы сделал что-то вроде этого:

Select
    id_no
    , stud_name
    , group_no
    , 'class_1'
    , class_1 as grade
From tbl_stud_class

Union All

Select
    id_no
    , stud_name
    , group_no
    , 'class_2'
    , class_2 as grade
From tbl_stud_class

Union All

etc.

Я бы также использовал полное слово "ученик" в именах таблиц и полей, но это не проблема с базой данных ...;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...