34,590
社区成员
发帖
与我相关
我的任务
分享
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender and std.Age>=10
where
cls.classno in ('102', '103')-- and std.Age >= 10
--测试通过
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students
where classno in ('102', '103') and Age >= 10 ) cls --在这加限制条件
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*
102 男 2
102 女 3
103 男 5
103 女 0
*/
SELECT DISTINCT s.classno, ISNULL(m.GENDER, 0) AS GENDER, ISNULL(m.WW, 0) AS students
FROM [#Students] AS s LEFT OUTER JOIN
(SELECT classno, GENDER, COUNT(GENDER) AS WW
FROM [#Students] AS s
WHERE (GENDER = 0) and classno in('102','103')
GROUP BY classno, GENDER) AS m ON s.classno = m.classno
where s.classno in('102','103')
UNION
SELECT DISTINCT s.classno, ISNULL(m.GENDER, 0) AS GENDER, ISNULL(m.Man, 0) AS students
FROM [#Students] AS s LEFT OUTER JOIN
(SELECT classno, GENDER, COUNT(GENDER) AS Man
FROM [#Students] AS s
WHERE (GENDER = 1)
GROUP BY classno, GENDER) AS m ON s.classno = m.classno
where s.classno in('102','103')
classno GENDER students
-------------------------------------------------- ----------- -----------
102 0 3
102 1 2
103 0 0
103 1 5
(4 row(s) affected)
if object_id('Students') is not null
drop table Students;
create table Students
(
StudentNo varchar(50), --学号
ClassNo varchar(50), --班级
Gender INT, --性别 0:女 1:男
Age INT --年龄
)
go
if object_id('Genders') is not null
drop table Genders;
create table Genders
(
Gender INT,
GenerName VARCHAR(20)
)
go
insert into Genders values(0, '女')
insert into Genders values(1, '男')
go
insert into Students values('00001', '101', 1, 8);
insert into Students values('00002', '101', 1, 8);
insert into Students values('00003', '101', 0, 8);
insert into Students values('00004', '101', 1, 8);
insert into Students values('00005', '101', 0, 8);
insert into Students values('00006', '102', 0, 11);
insert into Students values('00007', '102', 1, 11);
insert into Students values('00008', '102', 0, 11);
insert into Students values('00009', '102', 1, 11);
insert into Students values('00010', '102', 0, 11);
insert into Students values('00011', '103', 1, 10);
insert into Students values('00012', '103', 1, 10);
insert into Students values('00013', '103', 1, 10);
insert into Students values('00014', '103', 1, 10);
insert into Students values('00015', '103', 1, 10);
GO
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students) cls
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*--输出结果,满足要求
101 男 3
101 女 2
102 男 2
102 女 3
103 男 5
103 女 0
*/
--想查102和103班的男女数,结果又不对了
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students) cls
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
where
cls.classno in ('102', '103') and std.Age >= 10
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*--输出结果
102 男 2
102 女 3
103 男 5
*/
/*--期望输出结果
102 男 2
102 女 3
103 男 5
103 女 0
*/
if object_id('Students') is not null
drop table Students;
create table Students
(
StudentNo varchar(50), --学号
ClassNo varchar(50), --班级
Gender INT --性别 0:女 1:男
)
go
if object_id('Genders') is not null
drop table Genders;
create table Genders
(
Gender INT,
GenerName VARCHAR(20)
)
go
insert into Genders values(0, '女')
insert into Genders values(1, '男')
go
insert into Students values('00001', '101', 1);
insert into Students values('00002', '101', 1);
insert into Students values('00003', '101', 0);
insert into Students values('00004', '101', 1);
insert into Students values('00005', '101', 0);
insert into Students values('00006', '102', 0);
insert into Students values('00007', '102', 1);
insert into Students values('00008', '102', 0);
insert into Students values('00009', '102', 1);
insert into Students values('00010', '102', 0);
insert into Students values('00011', '103', 1);
insert into Students values('00012', '103', 1);
insert into Students values('00013', '103', 1);
insert into Students values('00014', '103', 1);
insert into Students values('00015', '103', 1);
GO
select c.ClassNo,c.GenerName,num=sum(case when d.Gender=c.Gender then 1 else 0 end)
from
(
select distinct ClassNo,GenerName,b.Gender from Students a
cross join Genders b
)c
left join Students d on c.ClassNo=d.ClassNo and c.Gender=d.Gender
where
c.classno in ('102', '103')
group by c.ClassNo,c.GenerName
order by c.ClassNo
ClassNo GenerName num
-------------------------------------------------- -------------------- -----------
102 男 2
102 女 3
103 男 5
103 女 0
(4 行受影响)
--测试通过
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students
where classno in ('102', '103') ) cls --在这加限制条件
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*
102 男 2
102 女 3
103 男 5
103 女 0
*/
if object_id('Students') is not null
drop table Students;
create table Students
(
StudentNo varchar(50), --学号
ClassNo varchar(50), --班级
Gender INT --性别 0:女 1:男
)
go
if object_id('Genders') is not null
drop table Genders;
create table Genders
(
Gender INT,
GenerName VARCHAR(20)
)
go
insert into Genders values(0, '女')
insert into Genders values(1, '男')
go
insert into Students values('00001', '101', 1);
insert into Students values('00002', '101', 1);
insert into Students values('00003', '101', 0);
insert into Students values('00004', '101', 1);
insert into Students values('00005', '101', 0);
insert into Students values('00006', '102', 0);
insert into Students values('00007', '102', 1);
insert into Students values('00008', '102', 0);
insert into Students values('00009', '102', 1);
insert into Students values('00010', '102', 0);
insert into Students values('00011', '103', 1);
insert into Students values('00012', '103', 1);
insert into Students values('00013', '103', 1);
insert into Students values('00014', '103', 1);
insert into Students values('00015', '103', 1);
GO
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students) cls
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*--输出结果,满足要求
101 男 3
101 女 2
102 男 2
102 女 3
103 男 5
103 女 0
*/
--想查102和103班的男女数,结果又不对了
select
cls.ClassNo, gd.GenerName, count(std.StudentNo) as Students
from
(select distinct ClassNo from Students) cls
cross join Genders gd
left join Students std on std.ClassNo=cls.ClassNo and std.Gender=gd.Gender
where
std.classno in ('102', '103')
group by
cls.ClassNo, gd.GenerName
order by
cls.ClassNo, gd.GenerName
/*--输出结果
102 男 2
102 女 3
103 男 5
*/
/*--期望输出结果
102 男 2
102 女 3
103 男 5
103 女 0
*/