sql 排序 分组 层级 筛选 - God聚会啊
2014-05-07 14:48
183 查看
前言:
以前做过2种列表,1是有排序,有筛选功能,但是没有层级和分组,2是有树形结构的层级和分组,但是数据是一下全部加载出来,虽然有点落后,没有用到分页加载,但是也是受制于大环境。
今天有1个需求是 分组 排序 筛选 层级, 一开始没有想到好办法,后来才知道可以order by 按组排序。
核心思想:
表中有2个字段,层级level, id, parentid,这里就是先把过滤好的数据的id和parentid形成1个集合,在原有的数据表中查找这个集合对应的数据,再额外多做2个字段(本次需求是这样排序,如果你有需要可以自行调整),1个是分区的groupid,1个是分组内的排序groupinnnerid,为了防止点击排序之后父子级乱掉,需要这个分组内id始终升序,或者始终降序。
代码参考:
上面1种做法结果不是很理想,就是多列需要排序的情况下就不是很完美。
鉴于C#在处理循环方面代码要比SQL简单易写一些,这里提供第2种思路:
这里有2级层级,先把目标数据查出来,然后把其中的level=1和level=2的父节点找出来做1个去重,使用union,然后按照自己的需求排序,然后把其中level=2的做成另外一张表,然后顺序遍历第1张表的每一行,在第2张表中找到它的子节点,按顺序添加,那么完成之后的datatable就是已经排过序,并且有层级的,这样的好处是不用想去拼接Hierarchy字段,缺点是不能灵活处理多级的问题。
如果你有更好更灵活的思路,可以给我留言,知识需要分享才宝贵!
以前做过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字段,缺点是不能灵活处理多级的问题。
如果你有更好更灵活的思路,可以给我留言,知识需要分享才宝贵!
相关文章推荐
- SQL中获取排序分组后数据的脚本
- SQL语句分组排序,多表关联排序
- mysql sql_mode 修改 排序分组查询
- SQL数据分组后取最大值或者取前几个值(依照某一列排序)
- sql指定排序规则、筛选id最大或最小记录、查询插入数据
- hql先排序后分组(查询分组中的最新)(hql 执行原生态sql)
- sql 分组排序
- SQL中获取排序分组后数据的脚本
- SQL分组排序
- WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
- 如何:在 DataGrid 控件中对数据进行分组、排序和筛选
- SQL分组排序去重复
- sql实现分组排序-实例分别获取男女成绩前三名的学生姓名
- SQL进行排序、分组、统计的10个新技巧
- SQL分组排序 -转载
- oracle 根据某个字段分组,再根据另一个字段排序的sql查询 即 组内排序
- SQL学习之查询技巧 查询第3的数据 用一条语句分组,排序 并查询某一排名
- mysql分组排序取前N条记录的最简洁的单条sql
- SQL语句分组排序,多表关联排序
- sql先排序后分组