SQL语句分组排序,多表关联排序总结几种常见的方法:

案例一:

在查询结果中按人数降序排列,若人数相同,则按课程号升序排列?

分析:单个表内的多个字段排序,一般可以直接用逗号分割实现。

select * from tableA order by col1 desc,col2 asc;
-- 先按col1降序,相同则按col2 升序

案例二:

T-SQL查询班级信息:班级人数+班级信息,按人数多少排序?

-- 创建测试数据
create table stu(sid int primary key identity(1,1),sname varchar(50),sage int,scid int foreign key references class(cid))
create table class(cid int primary key identity(1,1),code varchar(50),cname varchar(50),cgrade varchar(50))
insert into stu values('张三',19,1)
insert into stu values('李四',20,2)
insert into stu values('王五',21,2)
insert into class values('c001','','一年级')
insert into class values('c002','','一年级') -- 按人数分组排序查询
select
class.cgrade,
class.code,
class.cname,
count(stu.sid) as 人数
from
class JOIN stu
ON (class.cid = stu.scid)
group by
class.cgrade,
class.code,
class.cname
order by
count(stu.sid) desc

案例三:

SQL 查询统计每个用户组发文章数量并按数量排序?

有三个表 文章表 记录文章标题、内容、发布人 发布时间,用户表 记录用户组id 用户名 密码,用户组表 记录id 用户组名称

问题是 现在要查询每个用户组发布文章的数量,并且按着数量排序。不知道怎么搞呀 大神们
还要查询 每个月中发文排行榜....

SELECT COUNT(1) AS 数量, c.用户组名称
FROM 文件表 a INNER JOIN 用户表 b ON a.发布人 = b.用户名
INNER JOIN 用户组表 c ON b.用户组id = c.id
GROUP BY c.id, c.用户组名称
ORDER BY 数量

案例四:“圈子广场”页面需要展示圈子列表,查询某类型圈子,其中需要按圈子名称搜索,同时按照圈子人数排序。

数据库表结构大致如下:

  圈子表“CMSocial”,字段包括:圈子主键 CMSocialID,圈子名称 SocialName,圈子状态 SocialState等;

  圈子类型关系表“CMSocialCategoryRelation”,字段包括 关系主键 CMSocialCategoryRelationID,圈子类型外键 CMSocialCategoryID,圈子外键 CMSocialID;

  圈子成员表“CMSocialMember”,字段包括:关系主键 CMSocialMemberID,成员外键 MemberID,圈子外键 CMSocialID,圈子成员状态 MemberState等;

USE [Community];

SELECT
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable,
COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber' /*圈子成员数*/
FROM CMSocial AS S

INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('','')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*内连接圈子类型*/

LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左连接圈子成员*/

WHERE S.IsAvailable=1 AND S.SocialState=0
 AND S.SocialName LIKE N'%创业圈%' /*圈子名称匹配查询*/

GROUP BY
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable
ORDER BY
COUNT(DISTINCT SM.CMSocialMemberID) DESC; /*圈子成员数排序*/

SQL 2005版本以后支持ROW_NUMBER()获取行号,于是进一步升级,使他支持分页,支持记录总数:

参考:

/* 最内层输入分页参数之前靠count(*) over ()获得记录总数,然后把这个值作为记录的一列传出来。*/
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT
c1,
c2,
count(*) over () tot_cnt
FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

这里总结一个SQL分页的万能SQL语句分页壳子

USE [Community];

DECLARE @pageindex INT /*页码*/
DECLARE @pagesize INT /*页数据量*/
SELECT @pageindex = 3,@pagesize = 1 SELECT A.*
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY ASub.ID DESC) AS RowNumber,* FROM
(
…… /*这里写自己的查询语句*/
) AS ASub
) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)

整合上面的分页SQL语句壳子,实现分页效果:

USE [Community];

DECLARE @pageindex INT /*页码*/
DECLARE @pagesize INT /*页数据量*/
SELECT @pageindex = 3,@pagesize = 1 SELECT A.*
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY ASub.MemberNumber DESC) AS RowNumber,* FROM
(
SELECT
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable,
COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber', /*圈子成员数*/
COUNT(*) OVER() 'RecordNumber' /*结果总数*/
FROM CMSocial AS S

 INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('','')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*内连接圈子类型*/

 LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左连接圈子成员*/

 WHERE S.IsAvailable=1 AND S.SocialState=0
 AND S.SocialName LIKE N'%创业圈%' /*圈子名称匹配查询*/

GROUP BY
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable
) AS ASub
) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)

SQL语句分组排序,多表关联排序的更多相关文章

  1. sql语句之条件,分页,排序

    sql语句之条件,分页,排序

  2. 使用SQL语句清空数据库所有表的数据

    使用SQL语句清空数据库所有表的数据 近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进 ...

  3. 使用sql语句复制一张表

    如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newbiao like chengjibiao(老表名); 第二步:将老表中的值复制到 ...

  4. sql 语句 获取某张表某列字段最短的某几行数据

    sql 语句 获取某张表某列字段最短的某几行数据 SELECT C_name,C_code FROM Catalog where LEN(C_code)=LEN((SELECT top 1 C_cod ...

  5. 【转载】C#常用数据库Sqlserver通过SQL语句查询数据库以及表的大小

    在Sqlserver数据库中,一般我们查看数据库的大小可以通过查找到数据库文件来查看,但如果要查找数据表Table的大小的话,则不可通过此方法,在Sqlserver数据库中,提供了相应的SQL语句来查 ...

  6. mysql / pgsql 使用sql语句查询数据库所有表注释已经表字段注释

    mysql使用sql语句查询数据库所有表注释已经表字段注释(转载)   场景: 1. 要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 ‘mammo ...

  7. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  8. 查看oracle的sql语句历史记录和锁表的情况

    查看oracle的sql语句历史记录和锁表的情况 (2012-01-04 20:59:59) 转载▼ 标签: 杂谈 分类: database 查询sql的历史记录 select * from v$sq ...

  9. 使用sql语句备份一张表

    如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newtable like oldtable; 第二步:将老表中的值复制到新标中. in ...

随机推荐

  1. 元素的click与dblclick

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,是用户或浏览器自身执行的某种动作.诸如click.load.mousemover,都是事 ...

  2. 剑指Offer面试题:3.替换空格

    一.题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 在网络编程中 ...

  3. 使用shell/python获取hostname/fqdn释疑

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  4. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

  5. 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍

    Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...

  6. 程序员的又一春,微信小程序带来的一个赚钱机遇

    微信小程序可能是原生的机遇,在程序员面对微信小程序的恐惧中说其实也是我们程序员创业的春天或者挣外快的一个机遇. 为什么这么说呢?且听我慢慢给你分析 成本角度 你想想,会ios开发的可能只会ios,会安 ...

  7. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

  8. jsp 分页, 判断是第一页,和最后一页.

    <% //页的行数 int pagesize =20; //当前页 int currentPage = 1; try { currentPage = Integer.parseInt(reque ...

  9. Utility2:Appropriate Evaluation Policy

    UCP收集所有Managed Instance的数据的机制,是通过启用各个Managed Instances上的Collection Set:Utility information(位于Managem ...

  10. OpenCASCADE Performance Test

    OpenCASCADE Performance Test eryar@163.com Abstract. Use the Draw Test Harness to test the performan ...