Транспонировать данные в SQL с новым столбцом - PullRequest
3 голосов
/ 18 февраля 2020

У меня есть данные вроде:

id maths phy chem 
1   50   60   21
2   60   80   22
3   80   90   23

Теперь я хочу, чтобы они выглядели так:

sub   1   2   3
math 50  60  80 
phy  60  80  90
chem 21  22  23

мой код:

select *
  from mrks
    pivot
(
  max(maths) 
  for id in ([1], [2], [3])
) piv

как бы я ни был m сталкивается с 2 проблемами

  1. Я не могу транспонировать значения chem и phy

  2. Не могу группировать математику, phy и chem по subj

Ответы [ 3 ]

4 голосов
/ 18 февраля 2020

На SQL сервере вы можете отключить с помощью cross apply, а затем с помощью условного агрегирования:

select 
    col,
    max(case when id = 1 then val end) col1,
    max(case when id = 2 then val end) col2,
    max(case when id = 3 then val end) col3
from mytable t
cross apply (values ('maths', maths), ('phy', phy), ('chem', chem)) p(col, val)
group by col

Демонстрация на БД Fiddle :

col   | col1 | col2 | col3
:---- | ---: | ---: | ---:
chem  |   21 |   22 |   23
maths |   50 |   60 |   80
phy   |   60 |   80 |   90
0 голосов
/ 18 февраля 2020

Это также будет работать

DECLARE @tble TABLE (id INT, maths INT, phy INT, chem INT)
INSERT INTO @tble VALUES
(1,50,60,21),(2,60,80,22),(3,80,90,23);

select * from(
SELECT ID,maths AS Scores, 'maths' as Subjects FROM @tble
UNION
SELECT ID,phy AS Scores, 'phy' as Subjects FROM @tble
UNION
SELECT ID,chem AS Scores, 'chem' as Subjects FROM @tble  
  ) s
PIVOT
(
  MIN(Scores) 
  FOR id IN ([1], [2], [3])
) piv
0 голосов
/ 18 февраля 2020

Вы не можете сделать PIVOT для нескольких столбцов, вы можете получить желаемый результат, используя UNION, как показано ниже.

SELECT 'Math' AS Sub,*
FROM (SELECT id ,maths FROM mrks) t
PIVOT(MAX(maths) FOR id IN ([1], [2], [3])) piv

UNION ALL

SELECT 'Phy' AS Sub,*
FROM (SELECT id,phy FROM mrks) t
PIVOT(MAX(phy) FOR id IN ([1], [2], [3])) piv

UNION ALL

SELECT 'Chem' AS Sub,*
FROM (SELECT id,chem FROM mrks) t
PIVOT(MAX(chem) FOR id IN ([1], [2], [3])) piv
...