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)
小智 7
您也可以通过使用以下代码的逻辑序列来尝试标准的sql un-pivoting方法.以下代码包含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)
归档时间: |
|
查看次数: |
243437 次 |
最近记录: |