sql server 分组与统计/查询列表 多场景解读

分组 方向  1:以数据库资源为主,进行分组   2:以页面展示为主,进行分组   

什么意思呢 比如说按照月份 统计 花费金额,  数据库可能只有 1月 5月的金额,按照数据库为主 分组 那就只有俩个 月份1月 5月数据,

但是可能页面上是1-12月都展示  这就需要以页面这1-12个月为主 数据库去匹配内容 没有的也得赋值0

 

数据库为主: 场景1  单表分组  简单求和

解决方式   sum(case when条件)   group by  就可以  没有条件直接 count

数据库为主: 场景2  多表关联分组  简单求和

解决方式 1.  sum(case when 条件复杂)   group by 

解决方式2. 子查询   比如还是月份分组 求 月份 总消费额 和   消费超500的 数量

select (select count(*) from  tb1 where 消费超500 and 月份=tb.月份) 数量

from tb left join tb2  on..   group by tb.月份

数据库为主: 场景3  单表分组  只统计每个组别第一条信息里的内容

这时候用分区函数  partition by  与row_number 结合 分区分组 从而可 在外包一层查询根据 rowno来找第一个信息

以页面为主  比如说固定页面上找8-12 月的 数据

 利用union  首先要 建立 页面所需要展示的 临时表temp

select (select  08 ‘Month’

union 09  union 10 union 11 union 12) temp   

然后 left join  tb  on  temp.Month = FORMAT(tb  .CreateTime, ‘MM’)   匹配上  之后 group by  temp.Month    聚合一下count 或者sum( case when条件) 

补充:1如果页面8-12月不是固定的 是根据当前时间 或者是 有条件的几个月份  用c#代码先模拟出来 月份

var time1 = DateTime.Now.Year+”/”+ (DateTime.Now.Month.ToString().Length > 1 ? DateTime.Now.Month.ToString() : “0” + DateTime.Now.AddMonths(-1).Month.ToString());  //2020/01

补充2:如果left join  之后 不能够在 where 去进行条件筛查  以免 让 8-12月的数据 丢失掉  如果有条件 就 写在 case when 中

补充3: 如果 sum(case when )之后为null 怎么办 我需要的是0   使用isnull函数

ISNULL(sum(case when 条件满足 then 1 else 0 end),0)  ‘数量’

 

 

查询列表  核心 就是   匹配   过滤   查  怎么匹配  怎么过滤  怎么查

场景1  查询条件涉及 单表    列表展示涉及 单表

直接 select 想要的  where 条件即可

场景2  查询条件 涉及多表  列表展示 单表

既然条件涉及多表  那么这几个表肯定是用到的 因为需要过滤内容

解决方式1: 如果是1对1 关系的  1对多的  (多对多的不可行)  直接  select 想要的 主表 left join  这些过滤表 然后 where 条件      (匹配-过滤-查)

解决方式2:子查询   利用与主表关系的那个点  比如说id    select 想要的主表 where  id  in (子查询 查除满足筛选条件的对应的主建pid) 

     就是(查-匹配-过滤)通常都是不好先匹配的时候 就先查

场景3  查询条件 多表   列表展示多表

查询多表 肯定要用到    展示多表  展示的表肯定要join 然后在select 内容

首先确定展示的数据的唯一性  也就是展示表之间的关系    展示的内容是 一条 还是 剧有部分重复内容的也可展示  确定这一点   就可以在 join 的  on 匹配机制中设置好

比如说 tb1  tb2  tb3 三个表是展示列表需要的   是唯一内容展示  那么需要将tb2  tb3 中的唯一性体现出来

select 内容 from tb1 left join tb2 on tb1.id=tb2.pid  and  tb2.status=’有效’  left join tb3  on tb1.id=tb3.pid  and  tb3.时间=‘最后一个’

这样一来展示的处理结束,然后进行 条件的过滤    可以用子查询

 子查询的话  好用在  查询内容可以用,也可以当作过滤条件的一种手段 

子查询的好处 就是  将关注点 集中  只关注 这个条件下 满足的结果  在利用 与主表 关系的那个点 去进行 匹配

本文地址:https://blog.csdn.net/Marzlam/article/details/110633579

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐