有如下列: 班级代码(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 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 10 70 1 -10 -10
1 60 null null null
2 30 30 2 -20 -20我上面写的例子都是假设的,其实我数据库里是有很多记录的!我要实现的就是将单独的那个分数列,用两列显示出来分别显示的>0的一列和<0的一列。完了算出来每个班级代码分数的合计也单独用一列显示出来。
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)
*/
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是什么意思,就我上面的数据,能说出你的结果是什么?你上面给的结果没有一个能看明白的?
班级代码 加奖 加奖合计 班级代码 加奖 加奖合计
----------- ----------- ----------- ----------- ----------- -----------
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
班级代码 加奖 加奖合计 班级代码 扣奖 扣奖合计
----------- ----------- ----------- ----------- ----------- -----------
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班没有显示在一起而是分开显示的!
现在的问题是:你显示的内容没有都并在一起:你看我给你打个比方:
班级代码 加奖 加奖合计 班级代码 加奖 加奖合计
----------- ----------- ----------- ----------- ----------- -----------
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
..........................................................
以次类推
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)
*/
班级代码 加奖 加奖合计 班级代码 扣奖 扣奖合计
----------- ----------- ----------- ----------- ----------- -----------
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班的扣奖出现重复记录了!而这是不应该的!能否想个办法去掉!
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)*/
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)*/