在SQL中使用新列转置数据

3

我有一组数据:

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

然而,我面临着两个问题:

  1. 我无法转置化学和物理值

  2. 无法将数学、物理和化学分组到科目下


如果有人插入行(4,75,77,81),您希望发生什么? - jarlh
3个回答

4
在SQL Server中,您可以使用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

DB Fiddle上的示例

列   | 列1 | 列2 | 列3
:---- | ---: | ---: | ---:
化学  |   21 |   22 |   23
数学 |   50 |   60 |   80
物理   |   60 |   80 |   90

0
您无法在多列上执行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

0

这也可以工作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接