sql 排序 分组 层级 筛选 - God聚会啊

前言:

以前做过2种列表,1是有排序,有筛选功能,但是没有层级和分组,2是有树形结构的层级和分组,但是数据是一下全部加载出来,虽然有点落后,没有用到分页加载,但是也是受制于大环境。

今天有1个需求是 分组 排序 筛选
层级, 
一开始没有想到好办法,后来才知道可以order by
按组排序。

核心思想:

表中有2个字段,层级level, id,
parentid,这里就是先把过滤好的数据的id和parentid形成1个集合,在原有的数据表中查找这个集合对应的数据,再额外多做2个字段(本次需求是这样排序,如果你有需要可以自行调整),1个是分区的groupid,1个是分组内的排序groupinnnerid,为了防止点击排序之后父子级乱掉,需要这个分组内id始终升序,或者始终降序。

代码参考:


SELECT
--分组ID,把父子元素划分为同1区域
CASE WHEN Parent IS NULL THEN ReportID ELSE Parent END AS GroupID,
--区域内最父级不参加排序,故设置其标示为0,其他子级为1
CASE WHEN Parent IS NULL THEN 0 ELSE 1 END AS GroupInnerID,
--内包含1个标示该行是第几级的字段,用于做颜色,加粗等的区分
*
FROM dbo.ReportList
WHERE ReportID IN (
--本该有的数据的id
SELECT ReportID
FROM dbo.ReportList
WHERE ActiveRecord = 1 AND URL IS NOT NULL AND ReportName LIKE ‘%proj%‘
UNION ALL
--以上数据的父id
SELECT Parent
FROM dbo.ReportList
WHERE ActiveRecord = 1 AND URL IS NOT NULL AND ReportName LIKE ‘%proj%‘
)
--1.按照区域分组,升序降序和需要排序的字段保持一致
--2.组内父子级排序,始终按照升序排序,因为父节点应该不论怎么样排序都在第1条记录上
--3.个性化排序
--4.建议在最后加1个不重复字段排序,防止在前3种情况排序下都无法区分先后顺序,以至于点击排序会顺序乱掉
ORDER BY
GroupID,
GroupInnerID,
ReportName DESC

上面1种做法结果不是很理想,就是多列需要排序的情况下就不是很完美。

鉴于C#在处理循环方面代码要比SQL简单易写一些,这里提供第2种思路

这里有2级层级,先把目标数据查出来,然后把其中的level=1和level=2的父节点找出来做1个去重,使用union,然后按照自己的需求排序,然后把其中level=2的做成另外一张表,然后顺序遍历第1张表的每一行,在第2张表中找到它的子节点,按顺序添加,那么完成之后的datatable就是已经排过序,并且有层级的,这样的好处是不用想去拼接Hierarchy字段,缺点是不能灵活处理多级的问题。

如果你有更好更灵活的思路,可以给我留言,知识需要分享才宝贵!

时间: 2024-10-14 12:40:31

sql 排序 分组 层级 筛选 - God聚会啊的相关文章

最常用的SQL排序、分组与统计的使用方法

以一种有意义的方式组织数据可能是一项挑战.有时你需要的可能是一个简单的排序,但是通常你需要做更多,你需要分组来进行分析和统计.幸运的是,SQL提供了大量语句和操作来进行排序,分组和摘要.下面的一些技巧将会帮助你识别什么时候排序,什么时候分组,什么时候以及如何统计.对要每条语句和操作的详细信息请查看Books Online. 1. 使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个

(转)最常用的SQL排序、分组与统计的使用方法 Order by/Group by/having等的使用

以一种有意义的方式组织数据可能是一项挑战.有时你需要的可能是一个简单的排序,但是通常你需要做更多,你需要分组来进行分析和统计.幸运的 是,SQL提供了大量语句和操作来进行排序,分组和摘要.下面的一些技巧将会帮助你识别什么时候排序,什么时候分组,什么时候以及如何统计.对要每条语句 和操作的详细信息请查看Books Online. 1. 使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,

SQL数据分组后取最大值或者取前几个值(按照某一列排序)

今日做项目的时候,项目中遇到需要将数据分组后,分组中的最大值,想了想,不知道怎么做,于是网上查了查,终于找到了思路,经过比较这个查询时目前用时最快的,其实还有别的方法,但是我觉得我们只掌握最快的方法就行 ,好了,不说废话了! 直接上内容吧:以下数据是通过 SELECT [CustomerCaseNo],[PaymentsTime] FROM [BOMSDatabase].[dbo].[BAL_paymentsSwiftInfo] where StoresNo='zq00000034' group

sql实现分组并排序

今天遇到一个sql,分组求和过后排序,就想一句sql实现 开始是这么想的: select re.c, re.d from (select c, max(d) as d from a group by c) re order by re.d desc 总感觉重复啰嗦,就百度了一下下(以为要用having,结果就下面简单一句搞定): select c,max(d) from a group by c order by max(d) desc 资料来源

SQL Server 分组后取Top N

SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿.冥思苦想,遍查网络,不曾想这竟然是SQL界的一个经典话题.今日将我得来的若干方法列出,抛砖引玉,以期与众位探讨. 正文之前,对示例表结构加以说明. 表SectionTransactionLog,用来记录各部门各项活动的日志表 SectionId,部门Id SectionTransactionTyp

sql server——分组查询(方法和思想)

思想 先排序在汇总 sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息.而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算. 使用GROUP BY进行分组查询 实例演示 --查询男女生的人数 在没有学习分组查询之前,我们可以安装常规的思路解决查询需求: select count(*) from student where sex='男' select count(*) from student where sex='女' 那

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec

自己写的sql排序

create function dbo.Fn_Sort (  @str varchar(1024) ) returns nvarchar(100) as begin declare @tb table(num int) declare @strtemp varchar(100) declare @cID varchar(100) declare @cEidx int declare @relation_code varchar(1024) set @[email protected] + ','

oracle sql 排序与比较中的技巧与注意事项(一)

在sql排序中,oracle默认采用二进制的排序方法.大小写有不同的值,大写的值排在前面.有时候,我们需要处理的情况是,希望忽略大小写来进行排序.有多种方法可以实现: 设置NLS环境变量 alter session set NLS_SORT = 'BINARY_CI'; 使用UPPER和LOWER函数 用UPPER函数和LOWER函数把要比较的字段名.文字都转换成大写或者小写后再比较.这种方法的不足之处在于,使用函数后,标准的索引就不能再使用了,优化器无法正常工作,应对的方式是使用基于功能的索引