欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-06 16:40:04
分组 方向 1:以数据库资源为主,进行分组 2:以页面展示为主,进行分组 什么意思呢 比如说按照月份 统计 花费金额, 数据库可能只有 1月 5月的金额,按照数据库为主 分组 那就只有俩个 月份1月 5月数据,但是可能页面上是1-12月都展示 这就需要以页面这1-12个月为主 数据库去匹配内容 没有的也得赋值0数据库为主: 场景1 单表分组 简单求和解决方式 sum(case when) group by 就可以数据库为主: 场景2 多表关联分组 简......

分组 方向  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来找第一个信息

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

以页面为主  比如说固定页面上找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

相关标签: Sql