有如下列: 班级代码(dm)    分数(score)
   1                10
   2                30
   3               -20
   4               -30
   5                40
   1                60
现在我实现如下查询结果:
班级代码  加奖   加奖合计   班级代码   扣奖   扣奖合计
 1         10      20         1         -10     -10
 1         10                 2         -20     -20
根本没有一一对应!应该显示的是:
班级代码  加奖   加奖合计   班级代码   扣奖   扣奖合计
 1         10      20         1         -10     -10
 1         10                null      null    null
 2         30      30        2          -20     -20
也就是说将单独的那个分数列,用两列显示出来分别显示的>0的一列和<0的一列。完了算出来每个班级代码分数的合计也单独用一列显示出来。(如上图的结果)

解决方案 »

  1.   

    班级代码  加奖   加奖合计   班级代码   扣奖   扣奖合计
     1         10      70         1         -10     -10
     1         60                null      null    null
     2         30      30        2          -20     -20我上面写的例子都是假设的,其实我数据库里是有很多记录的!我要实现的就是将单独的那个分数列,用两列显示出来分别显示的>0的一列和<0的一列。完了算出来每个班级代码分数的合计也单独用一列显示出来。
      

  2.   

    --是这样么?
    create table tb(dm int,score int)
    insert tb
    select    1,10
    union select    2,30
    union select    3,-20
    union select    4,-30
    union select    5,40
    union select    1,60
    select  班级代码=case when score>0 then dm else null end,
    加奖=case when score>0 then score else null end,
    加奖合计=(select sum(score) from tb where t.dm=dm AND score>0 ),
    班级代码=case when score<0 then dm else null end,
    加奖=case when score<0 then score else null end,
    加奖合计=(select sum(score) from tb where t.dm=dm AND score<0 )  
    from tb t 
    drop table tb
    /*
    班级代码        加奖          加奖合计        班级代码        加奖          加奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          NULL        NULL        NULL
    1           60          70          NULL        NULL        NULL
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL(6 row(s) affected)
    */
      

  3.   

    create table tb(dm int,score int)
    insert tb
    select    1,10
    union select    2,30
    union select    3,-20
    union select    4,-30
    union select    5,40
    union select    1,60
    select  班级代码=case when score>0 then dm else null end,
    加奖=case when score>0 then score else null end,
    加奖合计=(select sum(score) from tb where t.dm=dm AND score>0),
    班级代码=case when score<0 then dm else null end,
    扣奖=case when score<0 then score else null end,
    扣奖合计=(select sum(score) from tb where t.dm=dm AND score<0)  
    from tb t 
    drop table tb
    /*班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          NULL        NULL        NULL
    1           60          70          NULL        NULL        NULL
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL(6 row(s) affected)
    */没明白lz是什么意思,就我上面的数据,能说出你的结果是什么?你上面给的结果没有一个能看明白的?
      

  4.   

    另外!查询出来的结果不对称啊!例如:
    班级代码        加奖          加奖合计        班级代码        加奖          加奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          NULL        NULL        NULL
    1           60          70          NULL        NULL        NULL
                                         1           -20         -20
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    看看上图的1班就是没有对应上的!那个扣奖不是在第一行显示出来的而是另起一行了!
    5           40          40          NULL        NULL        NULL
      

  5.   

    哥们:是这样的查询结果:你看看
    班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          NULL        NULL        NULL
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL
    1           60          70          NULL        NULL        NULL那两个1班没有显示在一起而是分开显示的!
      

  6.   

    哥们:我弄出来在一起的了!加了个order by 班级代码
    现在的问题是:你显示的内容没有都并在一起:你看我给你打个比方:
    班级代码        加奖          加奖合计        班级代码        加奖          加奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          NULL        NULL        NULL
    1           60          70          NULL        NULL        NULL
    NULL        NULL        NULL        1           -20         -20
    1           **          **          NULL        NULL        NULL
    NULL        NULL        NULL        1           -**         -**
    ------------------------------------------------------------------------
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL
    哥们你就看我上图的1班显示出来的都不对称!我现在数据库里有很多1班的记录,但是按照你的语句都分开显示了而我想要的结果是都合并起来的如下:
    班级代码        加奖          加奖合计        班级代码        加奖          加奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          70          1           -20         -20
    1           60          70          1           -**         -**
    1           **          **          null        null        null
    2           30          30
    ..........................................................
    以次类推
      

  7.   

    create table tb(dm int,score int)
    insert tb
    select    1,10
    union select    2,30
    union select    3,-20
    union select    4,-30
    union select    5,40
    union select    1,60
    union select    1,-20select 班级代码=a.dm,a.加奖,a.加奖合计,班级代码=b.dm,b.扣奖,b.扣奖合计
    from  (select dm from tb group by dm) t 
    left join (select dm,加奖=score,加奖合计=(select sum(score) from tb where t.dm=dm and score>0) from tb t where score>0) a on t.dm=a.dm
    left join (select dm,扣奖=score,扣奖合计=(select sum(score) from tb where t.dm=dm and score<0) from tb t where score<0) b on t.dm=b.dm
    drop table tb
    /*班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          50          1           -20         50
    1           60          50          1           -20         50
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL(6 row(s) affected)
    */
      

  8.   

    哥们:不好意思啊!又出问题了!你看你的查询结果:
    班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          50          1           -20         50
    1           60          50          1           -20         50
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -20         -20
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL那个1班的扣奖出现重复记录了!而这是不应该的!能否想个办法去掉!
      

  9.   

    create table tb(dm int,score int)
    insert tb
    select    1,10
    union select    2,30
    union select    3,-20
    union select    4,-30
    union select    5,40
    union select    1,60
    union select    1,-20
    union select    1,40
    union select    1,45
    union select    1,-30
    union select    3,-40
    union select    3,-50select 班级代码=e.dm,e.加奖,e.加奖合计,班级代码=f.dm,f.扣奖,f.扣奖合计 from 
    (select dm=isnull(b.dm,a.dm),b.加奖,b.加奖合计,cnt=isnull(b.cnt,0) from (select dm from tb group by dm) a left join (select dm,加奖=score,加奖合计=(select sum(score) from tb where t.dm=dm and score>0),cnt=(select count(1) from tb where t.dm=dm and t.score>score and score>0) from tb t where score>0) b on a.dm=b.dm ) e full join 
    (select dm=isnull(c.dm,a.dm),c.扣奖,c.扣奖合计,cnt=isnull(c.cnt,0) from (select dm from tb group by dm) a left join (select dm,扣奖=score,扣奖合计=(select sum(score) from tb where t.dm=dm and score<0),cnt=(select count(1) from tb where t.dm=dm and t.score>score and score<0)  from tb t where score<0) c on a.dm=c.dm ) f on e.dm=f.dm and e.cnt=f.cnt
    order by isnull(e.dm,f.dm)drop table tb
    /*
    班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          155         1           -30         -50
    1           40          155         1           -20         -50
    1           60          155         NULL        NULL        NULL
    1           45          155         NULL        NULL        NULL
    2           30          30          2           NULL        NULL
    3           NULL        NULL        3           -50         -110
    NULL        NULL        NULL        3           -40         -110
    NULL        NULL        NULL        3           -20         -110
    4           NULL        NULL        4           -30         -30
    5           40          40          5           NULL        NULL(10 row(s) affected)*/
      

  10.   

    create table tb(dm int,score int)
    insert tb
    select    1,10
    union select    2,30
    union select    3,-20
    union select    4,-30
    union select    5,40
    union select    1,60
    union select    1,-20
    union select    1,40
    union select    1,45
    union select    1,-30
    union select    3,-40
    union select    3,-50select  班级代码=case when e.加奖 is null then null else e.dm end ,e.加奖,e.加奖合计,
    班级代码=case when f.扣奖 is null then null else f.dm end ,f.扣奖,f.扣奖合计 from 
    (select dm=isnull(b.dm,a.dm),b.加奖,b.加奖合计,cnt=isnull(b.cnt,0) from (select dm from tb group by dm) a left join (select dm,加奖=score,加奖合计=(select sum(score) from tb where t.dm=dm and score>0),cnt=(select count(1) from tb where t.dm=dm and t.score>score and score>0) from tb t where score>0) b on a.dm=b.dm ) e full join 
    (select dm=isnull(c.dm,a.dm),c.扣奖,c.扣奖合计,cnt=isnull(c.cnt,0) from (select dm from tb group by dm) a left join (select dm,扣奖=score,扣奖合计=(select sum(score) from tb where t.dm=dm and score<0),cnt=(select count(1) from tb where t.dm=dm and t.score>score and score<0)  from tb t where score<0) c on a.dm=c.dm ) f on e.dm=f.dm and e.cnt=f.cnt
    order by isnull(e.dm,f.dm)drop table tb
    /*班级代码        加奖          加奖合计        班级代码        扣奖          扣奖合计        
    ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          155         1           -30         -50
    1           40          155         1           -20         -50
    1           60          155         NULL        NULL        NULL
    1           45          155         NULL        NULL        NULL
    2           30          30          NULL        NULL        NULL
    NULL        NULL        NULL        3           -50         -110
    NULL        NULL        NULL        3           -40         -110
    NULL        NULL        NULL        3           -20         -110
    NULL        NULL        NULL        4           -30         -30
    5           40          40          NULL        NULL        NULL(10 row(s) affected)*/