在列中进行子查询

1、在一个表中有多个员工ID,比如一个下单员工,一个修改订单的员工,可以使用在列中进行子查询,具体如下:

   (
SELECT
staff_name
FROM
sp_staff_basic
WHERE
sp_staff_basic.id = qc_return_progress_record.created_by
) returnProcessName, LEFT JOIN sp_staff_basic ON sp_staff_basic.id = qc_returnrervice.updated_by

2、left join 自己的表,比如说在一个表中,有一个出发时间字段,又有一个到达时间字段,两个表所对应的节点不一致,但是两个表都记录在订单表中,比如订单的一个状态为出发吗,一个状态为到达,我们需要计算路途中所花的时长,left join 自己的表,就可以取出两个节点所对应的时间,具体如下:

select
sp_staff_usework.attach_group attachGroup,COUNT(sp_staff_usework.attach_group) countFrequency,sp_staff_basic.id staffId
from (SELECT * from or_order_state_record where or_order_state_record.state_type=3) n1
LEFT JOIN (SELECT * from or_order_state_record where or_order_state_record.state_type=4) n2 on n1.order_id=n2.order_id
LEFT JOIN sp_staff_basic on sp_staff_basic.id=n1.created_by
LEFT JOIN sp_staff_usework on sp_staff_usework.staff_id=n1.created_by where TIMESTAMPDIFF(MINUTE,n1.created_date,n2.created_date)>3
GROUP BY sp_staff_usework.attach_group

这种方法还可以用来做统计表,表中有多个统计字段的,比如我下面做的客服的服务质量表:

        SELECT
sp_staff_basic.id staffId,
sp_staff_usework.attach_group attachGroup,
t1.countFrequency timeoutAudit,
t2.countFrequency timeOutList,
t3.countMis countMis,
t4.countOrderChange countOrderChange,
t5.countPeople countPeople,
sp_staff_basic.staff_name staffName,
sp_staff_usework.position_code positionCode,
sp_staff_usework.position_class postionClass,
sp_company.id companyId,
sp_company.company_name companyName
from sp_staff_basic
LEFT JOIN sp_staff_usework
on sp_staff_usework.staff_id=sp_staff_basic.id
LEFT JOIN(
select
sp_staff_usework.attach_group attachGroup,COUNT(sp_staff_usework.attach_group) countFrequency,sp_staff_basic.id staffId
from (SELECT * from or_order_state_record where or_order_state_record.state_type=3) n1
LEFT JOIN (SELECT * from or_order_state_record where or_order_state_record.state_type=4) n2 on n1.order_id=n2.order_id
LEFT JOIN sp_staff_basic on sp_staff_basic.id=n1.created_by
LEFT JOIN sp_staff_usework on sp_staff_usework.staff_id=n1.created_by
<where>
<if test="param.startCreateDate != null">
AND n1.created_date <![CDATA[ >= ]]> #{param.startCreateDate,jdbcType=TIMESTAMP}
</if>
<if test="param.endCreateDate != null">
AND n1.created_date <![CDATA[ < ]]> date_add(#{param.endCreateDate,jdbcType=TIMESTAMP},interval 1 day)
</if>
and TIMESTAMPDIFF(MINUTE,n1.created_date,n2.created_date)>3
</where>
GROUP BY sp_staff_usework.attach_group
)t1 on sp_staff_usework.attach_group=t1.attachGroup
LEFT JOIN(
select
sp_staff_usework.attach_group attachGroup,COUNT(sp_staff_usework.attach_group) countFrequency,sp_staff_basic.id staffId
from (SELECT * from or_order_state_record where or_order_state_record.state_type=0) n1
LEFT JOIN (SELECT * from or_order_state_record where or_order_state_record.state_type=3) n2 on n1.order_id=n2.order_id
LEFT JOIN sp_staff_basic on sp_staff_basic.id=n1.created_by
LEFT JOIN sp_staff_usework on sp_staff_usework.staff_id=n1.created_by
<where>
<if test="param.startCreateDate != null">
AND n1.created_date <![CDATA[ >= ]]> #{param.startCreateDate,jdbcType=TIMESTAMP}
</if>
<if test="param.endCreateDate != null">
AND n1.created_date <![CDATA[ < ]]> date_add(#{param.endCreateDate,jdbcType=TIMESTAMP},interval 1 day)
</if>
and TIMESTAMPDIFF(MINUTE,n1.created_date,n2.created_date)>3
</where>
GROUP BY sp_staff_usework.attach_group
)t2 on sp_staff_usework.attach_group=t2.attachGroup
LEFT JOIN (
SELECT COUNT(qc_mistakenum.mistakenum_id) countMis,qc_mistakenum.staff_id staffId,qc_mistakenum.created_date from qc_mistakenum
<where>
<if test="param.startCreateDate != null">
AND qc_mistakenum.created_date <![CDATA[ >= ]]> #{param.startCreateDate,jdbcType=TIMESTAMP}
</if>
<if test="param.endCreateDate != null">
AND qc_mistakenum.created_date <![CDATA[ < ]]> date_add(#{param.endCreateDate,jdbcType=TIMESTAMP},interval 1 day)
</if>
</where>
) t3 on t3.staffId=sp_staff_basic.id
LEFT JOIN (
SELECT count(qc_orderchange.order_id) countOrderChange,qc_orderchange.created_by,qc_orderchange.created_date from qc_orderchange
<where>
<if test="param.startCreateDate != null">
AND qc_orderchange.created_date <![CDATA[ >= ]]> #{param.startCreateDate,jdbcType=TIMESTAMP}
</if>
<if test="param.endCreateDate != null">
AND qc_orderchange.created_date <![CDATA[ < ]]> date_add(#{param.endCreateDate,jdbcType=TIMESTAMP},interval 1 day)
</if>
</where>
) t4 on t4.created_by=sp_staff_basic.id
LEFT JOIN (
select qc_complaint_people.comp_people_id,count(qc_complaint_people.comp_people_id) countPeople,qc_complaint_record.created_date
from qc_complaint_people
LEFT JOIN sp_staff_basic
on sp_staff_basic.id=qc_complaint_people.comp_people_id
LEFT JOIN qc_complaint_record
on qc_complaint_record.comp_id=qc_complaint_people.comp_id
<where>
<if test="param.startCreateDate != null">
AND qc_complaint_record.created_date <![CDATA[ >= ]]> #{param.startCreateDate,jdbcType=TIMESTAMP}
</if>
<if test="param.endCreateDate != null">
AND qc_complaint_record.created_date <![CDATA[ < ]]> date_add(#{param.endCreateDate,jdbcType=TIMESTAMP},interval 1 day)
</if>
</where>
GROUP BY qc_complaint_people.comp_people_id
) t5 on t5.comp_people_id=sp_staff_basic.id
left join sp_company
on sp_company.id=sp_staff_usework.company_id
<where>
<if test="param.companyId != null">
and sp_company.id = #{param.companyId,jdbcType=VARCHAR}
</if>
<if test="param.staffId != null and param.staffId != ''">
and sp_staff_basic.id = #{param.staffId,jdbcType=INTEGER}
</if>
<if test="param.positionCode != null and param.positionCode != ''">
and sp_staff_usework.position_code = #{param.positionCode,jdbcType=INTEGER}
</if>
and (sp_staff_usework.position_code='KHFWZX_KFDDDY' or sp_staff_usework.position_code='KHFWZX_ZJKFDDDY' or
sp_staff_usework.position_code='KHFWZX_GJKFDDDY' or sp_staff_usework.position_code='ALL_ZGSKFGJJL' or
sp_staff_usework.position_code='ALL_ZGSKFJL' or sp_staff_usework.position_code='KHFWZX_ZSKFDDDY'
)
</where>
ORDER BY sp_staff_basic.id

最后的原型为,具体是使用员工去查询他的职位,通过职位去筛选其他的,具体见上sql脚本:

还有一个为服务满意度的

服务满意度的做了好久,在 AND 与 OR 的合用与业务逻辑上卡了蛮久的时间

首先

我们需要过滤出需要回访的

需要回访的为:

待回访跟踪中仅包含:电话回访-待回访/未接通;短信回访-超时未提交/不满意-且电话回访为待回访的/非常不满意-且电话回访为待回访的,见列表中的集中组合字段

只有在列表中的字段需要进行回访,其他的直接过滤到完成回访的列表,且还需要过滤点击回访,回访结果为未接通字段

所以在

待回访的sql脚本中我们使用的过滤条件为:

WHERE
or_task_node.node_type = 8
AND (
cs_customer.default_return_type IN (0, 1)
AND qc_returnrervice.sms_return_result IN (2, 7, 9, 3)
AND qc_returnrervice.phone_return_result IN (2, 3)
AND (
qc_return_satisfied_record.return_result IS NULL
OR qc_return_satisfied_record.return_result = 2
)
)
GROUP BY
or_rescue_order.id
ORDER BY
qc_returnrervice.created_date DESC

回访完成后,需要将其他结果与上面过滤条件过滤掉的字段信息全部进行显示,所以用 AND(A OR B)的结构进行筛选

WHERE
or_task_node.node_type = 8
AND (
(
qc_returnrervice.sms_return_result NOT IN (2, 7, 9, 3)
AND qc_returnrervice.phone_return_result NOT IN (2, 3)
)
OR (
qc_returnrervice.sms_return_result IN (2, 7, 9, 3)
AND qc_returnrervice.phone_return_result IN (2, 3)
AND qc_return_satisfied_record.return_result IN (0, 1)
)
)
GROUP BY
or_rescue_order.id
ORDER BY
qc_returnrervice.created_date DESC

进行相反的过滤,这样就能展示出来所有的回访信息

工作中遇到的比较奇怪的一些sql(一些子查询)的更多相关文章

  1. SQL Fundamentals: 子查询 || WHERE,HAVING,FROM,SELECT子句中使用子查询,WITH子句

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  2. 关于工作中.net转java遇到的一个远程调用传递重复参的问题。

    工作中遇到一个很奇怪的传参问题.之前.net使用的是一个List列表,列表中有几个重复的参数.列表中使用的model类是KeyValue. 我使用java模仿其写法,传递List和KeyValue.对 ...

  3. 工作中遇到的oracle分页查询问题及多表查询相关

    在工作中,有时,我们会用到oracle分页查询.这时,就需要先了解oracle的rownum.rowmun是oracle的伪列,只能用符号(<.<=.!=),而不能用这些符号(>,& ...

  4. 工作中遇到的令人头疼的bug

    工作中我们会遇到形形色色的bug,但是很多bug都可以调试很明显的看出来,这种bug解决起来我们不会那么头疼但是有些却让人头疼而捉急,特别是本地运行一切正常,上传服务器就会出现bug.现在我总结几个我 ...

  5. SQL基本操作(工作中够用了)

      以下文章内容都是我自己从平时学习SQL语言时整理而来,写这篇文章是希望我或大家在使用能更方便的查询. 如果有不完整或不正确的地方请大家指出~谢谢大家 基本SQL操作 创建数据库 CREATE DA ...

  6. 浅谈T-SQL中的子查询

    引言 这篇文章我们来简单的谈一下子查询的相关知识.子查询可以分为独立子查询和相关子查询.独立子查询不依赖于它所属的外部查询,而相关子查询则依赖于它所属的外部查询.子查询返回的值可以是标量(单值).多值 ...

  7. 在 SQL Server 数据库的 WHERE 语句中使用子查询

    这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Serv ...

  8. SELECT中(非常)常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

  9. SELECT中常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

随机推荐

  1. Python常用模块(二)

    一.json与pickle json与pickle模块是为了完成数据的序列化. 序列化是指把对象(变量)从内存中变成可存储或传输的过程,在Python中叫picking,在其他语言中也由其他的叫法,但 ...

  2. html table 的属性

    表格table th,td 文字顶部对齐 <th valign="top"></th> <td valign="top">& ...

  3. poi3.8随记

    System.out.println(sheet.getFirstRowNum());//结果是0 System.out.println(sheet.getLastRowNum());//如果一共有3 ...

  4. js报错 object is not a function

    主要是js函数名重名了,重命名就可以了.

  5. Struts2_Struts标签大致内容

    Struts-Tags1.通用标签 a) property b) set i.默认为 action scope,会将值放入 request 和 ActionContext中 ii. page.requ ...

  6. Azure本月最新活动,速度Mark!!

    缤纷五月,翠色盈盈,风光如画,小编在这里给大家汇总了这个多彩五月最新的活动合集.我们一切都准备好了,就等你来参加了~ 首先最重磅的当然是新一届的全球微软开发者大会!   有吃有喝有 Build,5 月 ...

  7. sudoer解释

    /etc/sudoer ## Sudoers allows particular users to run various commands as ## the root user, without ...

  8. git 因线上分支名重复导致无法拉取代码

    有时 git pull 或 git fetch 时发现 git 报了个异常,说法像是无法将线上某个分支与本地分支合并,由于分支是...(很长的hash)但是分支却是...(很长的hash) 仔细查查后 ...

  9. 封装win7系统、制作win7GHO镜像、制作一个自定义的镜像文件具体步骤、制作Win10镜像gho

    作者:导演你让灰太狼吃只羊 来源:CSDN 原文:https://blog.csdn.net/qq_35057426/article/details/83015516 版权声明:本文为博主原创文章,转 ...

  10. MySQL锁小结

    锁的作用:避免并发请求时对同一个数据对象同时修改,导致数据不一致.   怎么加锁: 1.事务T1在对某个数据对象R1操作之前,先向系统发出请求,对其加锁L1. 2.之后,事务T1对该数据对象R1有了相 ...