2013-04-03 47 views
1

我已经根据文本等级的现有列创建了数字的附加列。SQL使用大小写函数减去现有列中生成的值

例如,其中一个结果是C有一个结果列14

Tar TarVal TA TAVal 
A 20  A- 19 
B 17  B+ 18 
C 14  B+ 18 

我想要做的就是减去两个结果列,并创建一个新列的结果,例如TAVal - TarVal

Tar TarVal TA TAVal Difference 
A 20  A- 19  -1 
B 17  B+ 18  1 
C 14  B+ 18  4 

这里是我到目前为止的代码,但每列的减法至今躲避我:

select subject.target AS Tar, 
    (case subject.target 
    when 'A*' then 23 when 'A*-' then 22 when 'A+' then 21 when 'A' then 20 
    when 'A-' then 19 when 'B+' then 18 when 'B' then 17 when 'B-' then 16 
    when 'C+' then 15 when 'C' then 14 when 'C-' then 13 when 'D+' then 12 
    when 'D' then 11 when 'D-' then 10 when 'E+' then 9 when 'E' then 8 
    when 'E-' then 7 when 'F+' then 6 when 'F' then 5 when 'F-' then 4 
    when 'G+' then 3 when 'G' then 2 when 'G-' then 1 when 'U' then 0 end) as TarVal, 

    subject.result AS TA, 
    (case subject.result 
    when 'A*' then 23 when 'A*-' then 22 when 'A+' then 21 when 'A' then 20 
    when 'A-' then 19 when 'B+' then 18 when 'B' then 17 when 'B-' then 16 
    when 'C+' then 15 when 'C' then 14 when 'C-' then 13 when 'D+' then 12 
    when 'D' then 11 when 'D-' then 10 when 'E+' then 9 when 'E' then 8 
    when 'E-' then 7 when 'F+' then 6 when 'F' then 5 when 'F-' then 4 
    when 'G+' then 3 when 'G' then 2 when 'G-' then 1 when 'U' then 0 end) as TAVal 

    from subject 
    join student on subject.upn=student.upn 
    where subject.datacollection='March 2013' and student.stuyear=11 and 
    subject.name='English' 
    order by student.surname, student.forename 

回答

3
;WITH SQ AS (
select 
    student.surname, student.forename, 
    subject.target AS Tar, 
    (case subject.target 
    when 'A*' then 23 when 'A*-' then 22 when 'A+' then 21 when 'A' then 20 
    when 'A-' then 19 when 'B+' then 18 when 'B' then 17 when 'B-' then 16 
    when 'C+' then 15 when 'C' then 14 when 'C-' then 13 when 'D+' then 12 
    when 'D' then 11 when 'D-' then 10 when 'E+' then 9 when 'E' then 8 
    when 'E-' then 7 when 'F+' then 6 when 'F' then 5 when 'F-' then 4 
    when 'G+' then 3 when 'G' then 2 when 'G-' then 1 when 'U' then 0 end) as TarVal, 

    subject.result AS TA, 
    (case subject.result 
    when 'A*' then 23 when 'A*-' then 22 when 'A+' then 21 when 'A' then 20 
    when 'A-' then 19 when 'B+' then 18 when 'B' then 17 when 'B-' then 16 
    when 'C+' then 15 when 'C' then 14 when 'C-' then 13 when 'D+' then 12 
    when 'D' then 11 when 'D-' then 10 when 'E+' then 9 when 'E' then 8 
    when 'E-' then 7 when 'F+' then 6 when 'F' then 5 when 'F-' then 4 
    when 'G+' then 3 when 'G' then 2 when 'G-' then 1 when 'U' then 0 end) as TAVal 

    from subject 
    join student on subject.upn=student.upn 
    where subject.datacollection='March 2013' and student.stuyear=11 and 
    subject.name='English' 
) 
SELECT Tar, TarVal, TA, TAVal, TAVal - TarVal Difference 
FROM SQ 
order by surname, forename; 
+0

出于兴趣什么我试图做什么,即在结果集中创建不在原始表中的列? – Matt 2013-04-04 08:10:41

+0

** [扩展预测](http://en.wikipedia.org/wiki/Extended_projection)**但不确定这个术语有多常见或有其他。 – 2013-04-04 08:35:31

+0

谢谢@ypercube。 – Matt 2013-04-04 10:59:44