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
上一篇: 确定在Linux的Oracle用户下crontab是否有效
下一篇: 数学教具功能beta版本开发