不显示列名称

Til*_*lak 118 sql t-sql sql-server unpivot sql-server-2008

我有一个StudentMarks带有列的表Name, Maths, Science, English.数据就像

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10
Run Code Online (Sandbox Code Playgroud)

我希望得到如下安排:

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60
Run Code Online (Sandbox Code Playgroud)

使用unpivot,我可以正确获取Name,Marks,但无法将源表中的列名称获取到Subject所需结果集中的列.

我怎样才能做到这一点?

我到目前为止已达到以下查询(获取名称,标记)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 192

您的查询非常接近.您应该能够使用包括subject最终选择列表中的以下内容:

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with demo

  • 实时示例总是节省时间..比MSDN更好.. :) (34认同)

小智 7

您也可以通过使用以下代码的逻辑序列来尝试标准的sql un-pivoting方法.以下代码包含3个步骤:

  1. 使用交叉连接为每一行创建多个副本(在这种情况下也创建主题列)
  2. 创建列"标记"并使用案例表达式填写相关值(例如:如果主题是科学,则从科学列中选择值)
  3. 删除任何空组合(如果存在,如果基表中严格没有空值,则可以完全避免表表达式)

     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

使用交叉连接的另一种方法是在交叉连接内指定列名称

select name, Subject, Marks 
from studentmarks
Cross Apply (
    values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Run Code Online (Sandbox Code Playgroud)