记录个Sql分组使用

话说好久没写Sql了,结果和其他小组的同事写Sql的时候遭到鄙视了,看来Sql是永远不能丢的,有时间就要温习一下。

创建3张表:

Rel_SutAndCourse,T_Course,T_Stu

为3张表填充数据:

----Student
begin transaction

insert T_Stu(StuCode,StuName,Sex) values (‘Stu001‘,‘zhang chu chu‘,1)
insert T_Stu(StuCode,StuName,Sex) values (‘Stu002‘,‘li xiao long‘,1)
insert T_Stu(StuCode,StuName,Sex) values (‘Stu003‘,‘cheng long‘,1)
insert T_Stu(StuCode,StuName,Sex) values (‘Stu004‘,‘liu shi shi‘,0)

insert T_Stu(StuCode,StuName,Sex) values (‘Stu005‘,‘yang mi‘,0)
insert T_Stu(StuCode,StuName,Sex) values (‘Stu006‘,‘a sa‘,0)
insert T_Stu(StuCode,StuName,Sex) values (‘Stu007‘,‘a jiao‘,0)

commit transaction
----Course
select * from T_Course
begin transaction

insert T_Course(CourseCode,CourseName) values (‘course01‘,‘yu wen‘)
insert T_Course(CourseCode,CourseName) values (‘course02‘,‘shu xue‘)
insert T_Course(CourseCode,CourseName) values (‘course03‘,‘ying yu‘)
insert T_Course(CourseCode,CourseName) values (‘course04‘,‘ti yu‘)

commit transaction
----Relation
select * from Rel_SutAndCourse

begin transaction

insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (1,1,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (2,1,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (3,2,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (3,3,GETDATE())

insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (4,1,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (4,2,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (4,3,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (4,4,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (3,1,GETDATE())

insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (5,1,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (6,1,GETDATE())
insert Rel_SutAndCourse(StuId,CourseId,CreateTime) values (7,1,GETDATE())

commit transaction

然后虚拟出3个需求:

--查询出每门课程选课的学生数
select CourseId,count(*) as SutCount from Rel_SutAndCourse
group by CourseId
--查询每个学生选的课的数目
select StuId,count(*) as SutCount from Rel_SutAndCourse
group by StuId
--查询男女同学选课的数量
select stu.sex,Count(distinct rel.stuid) from Rel_SutAndCourse rel
inner join T_Stu stu on rel.StuId=stu.Id
group by stu.sex
--以2014-08-03 19:55为时间分割点,查询哪些同学在时间点之前选课,哪些在时间点之后选了课
select * from Rel_SutAndCourse

select stu.Id,stu.StuName from T_Stu stu
join Rel_SutAndCourse rel on stu.id=rel.StuId
where rel.Id<=(
select max(rel.Id) from Rel_SutAndCourse rel
where rel.CreateTime<‘2014-08-03 19:55‘
) group by stu.Id,stu.StuName

select stu.Id,stu.StuName from T_Stu stu
join Rel_SutAndCourse rel on stu.id=rel.StuId
where rel.Id>=(
select min(rel.Id) from Rel_SutAndCourse rel
where rel.CreateTime>‘2014-08-03 19:55‘
) group by stu.Id,stu.StuName

其实就是个简单的分组,一直认为自己的Sql是写的最烂的,看来必须加强啊,争取每次学一些。

记录个Sql分组使用

时间: 2024-11-10 08:28:23

记录个Sql分组使用的相关文章

【记录】T-SQL 分组排序中取出最新数据

原文:[记录]T-SQL 分组排序中取出最新数据 示例 Product 表结构: 示例 Product 表数据: 想要的效果是,以 GroupName 字段分组,取出分组中通过 Sort 降序最新的数据,通过示例数据,可以推算出结果数据的 ID 应该为:7.5.3. 示例 SQL 代码: select * from Product p where ID=(select top 1 ID from Product where p.GroupName=GroupName order by Sort

sql 分组后 组内排名

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号. 示例: xlh           row_num 1700              1 1500              2 1085             

05. 取SQL分组中的某几行数据

原文:05. 取SQL分组中的某几行数据 对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: if OBJECT_ID('testGroup') is not null drop table testGroup GO create table testGroup ( ID int identity primary key, UserID int, OrderID int )

Oracle EBS-SQL (MRP-2):检查期间主计划录入记录数.sql

SELECT      FU.description                           创建者,      MSD.CREATION_DATE             创建日期,      MSD.SCHEDULE_DESIGNATOR 计划名称,      MSD.SCHEDULE_DATE            计划日期,      MSI.SEGMENT1                      物料编码,      MSI.DESCRIPTION           

“取出数据表中第10条到第20条记录”的sql语句+select top 用法

1.首先,select top用法: 参考问题  select top n * from和select * from的区别 select * from table --  取所有数据,返回无序集合 select top n * from table  -- 根据表内数据存储顺序取前n条,返回无序集合 select * from table order by id desc -- 取所有数据,按id逆序返回有序列表 select top n * from table order by id des

“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法

1.首先.select top使用方法: 參考问题  select top n * from和select * from的差别 select * from table --  取全部数据.返回无序集合 select top n * from table  -- 依据表内数据存储顺序取前n条,返回无序集合 select * from table order by id desc -- 取全部数据.按id逆序返回有序列表 select top n * from table order by id d

sql 分组统计查询并横纵坐标转换

关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop table #mytbgodeclare @Year intset @Year=2014create table #mytb ([Date] int,[Count] int,[Price] decimal(18, 0),[spbm] varchar(50),[sppp] varchar(100),[spm

Oracle 查询并删除重复记录的SQL语句

查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where

SQL 分组后拼接字符串

with t as( select 'Charles' parent, 'William' child union select 'Charles', 'Harry' union select 'Anne', 'Peter' union select 'Anne', 'Zara' union select 'Andrew', 'Beatrice' union select 'Andrew', 'Eugenie' ) SELECT parent, STUFF( ( SELECT ','+ chil