一个高难度的SQL,谁要是写出来了我把我所有的分都给他!!
create table 学生表
(
姓名
所属班级
及格与否
)
现在往数据库增加多条学生信息,我要查出某个班级及格的有多少人。
但现在问题是,要是这个班没有一个及格的。我要得到下面的结构。
-----------
| 班级 | 数量 | 及格与否
-----------
| 1班 | 0 | 及格
-----------
| 1班 | 20 | 不及格
怎么搞。
[解决办法]
SELECT 班级,数量 = COUNT(1),及格与否 = '及格 ' FROM yTABLE WHERE [及格判断条件]
GROUP BY 班级
UNION ALL
SELECT 班级,数量 = COUNT(1),及格与否 = '不及格 ' FROM yTABLE WHERE [不及格判断条件]
GROUP BY 班级
ORDER BY 班级,及格与否
[解决办法]
同意楼上,看来我这一贴是白顶了
[解决办法]
create table 学生表
(
姓名 varchar(10),
所属班级 smallint,
及格与否 varchar(10)
)
insert into 学生表
select 'aa ',1, '及格 '
union all
select 'bb ',2, '不及格 '
union all
select 'cc ',1, '不及格 '
union all
select 'dd ',3, '及格 '
--select * from 学生表
select 所属班级,sum(case 及格与否 when '及格 ' then 1 else 0 end) as 数量, '及格 ' as 及格与否
from 学生表
group by 所属班级
union all
select 所属班级,sum(case 及格与否 when '不及格 ' then 1 else 0 end) as 数量, '不及格 ' as 及格与否
from 学生表
group by 所属班级
order by 所属班级
drop table 学生表
[解决办法]
--分别求出班级中的及格和不及格人数,然后再Union all
select 班级, count(*) as 数量, '及格 ' as 及格与否
from 学生表
where 及格与否= '是 '
group by 班级
union all
select 班级, count(*) as 数量, '不及格 ' as 及格与否
from 学生表
where 及格与否= '否 '
group by 班级
[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go
create table tb(姓名 varchar(10),所属班级 varchar(10),及格与否 varchar(10))
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'A ', '1班 ', '不及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'B ', '2班 ', '及格 ')
insert into tb(姓名,所属班级,及格与否) values( 'B ', '2班 ', '不及格 ')
go
select * , 及格与否 = '及格 ' from
(
select m.所属班级,isnull(n.数量,0) 数量 from
(select distinct 所属班级 from tb) m
left join
(select 所属班级 , count(*) 数量 , 及格与否 = '及格 ' from tb where 及格与否 = '及格 ' group by 所属班级) n
on m.所属班级 = n.所属班级
) t1 where 数量 = 0
union all
select * from
(
select 所属班级 , count(*) 数量 , 及格与否 = '及格 ' from tb where 及格与否 = '及格 ' group by 所属班级
union all
select 所属班级 , count(*) 数量 , 及格与否 = '不及格 ' from tb where 及格与否 = '不及格 ' group by 所属班级
) t2
order by 所属班级 , 及格与否 desc
drop table tb
/*
所属班级 数量 及格与否
---------- ----------- ------
1班 0 及格
1班 20 不及格
2班 1 及格
2班 1 不及格
(所影响的行数为 4 行)
*/
[解决办法]
select 所属班级,sum(case 及格与否 when '及格 ' then 1 else 0 end) as 数量, '及格 ' as 及格与否
from tb
group by 所属班级
union all
select 所属班级,sum(case 及格与否 when '不及格 ' then 1 else 0 end) as 数量, '不及格 ' as 及格与否
from tb
group by 所属班级
order by 所属班级, 及格与否 desc
[解决办法]
来晚了,都写得好
[解决办法]
佩服,以后要和各位高手学习学习!!!
[解决办法]
这个分是不是太容易了,呵呵,楼主得卖血了,哈哈