针对这个 sql 语句进行解析

  1 SELECT
2 a.*
3 , b.L12_create_time L1第一次转L2的时间
4 , ROUND(c.L1_pending/60, 2) "等待总时长L1(分钟)"
5 , ROUND(d.L1forward_time/60, 2) "转移时长L1(分钟)"
6
7 from
8 (
9 SELECT
10 a.id
11 , a.tn
12 , a.create_time
13 , max(case when IFNULL(f.id,0)<>0 then f.create_time ELSE NULL END) "关闭时间"
14 , max(case when b.field_id=86 then b.value_text else null end) 工单来源
15 , max(case when b.field_id=255 then b.value_text else null end) 模块
16 , max(case when b.field_id=240 then b.value_text else null end) 解决团队
17 , g.name 服务水平协议
18 FROM
19 ticket a
20 left join dynamic_field_value b on a.id=b.object_id and b.field_id IN(86,255,240)
21 right JOIN ticket_history f on a.id = f.ticket_id AND (f.name LIKE '%closed successful%' OR f.name LIKE '%首次电话解决%'OR f.name LIKE '%用户无回应%')
22 LEFT JOIN sla g ON a.sla_id=g.id
23 right JOIN dynamic_field_value e ON a.id=e.object_id AND e.field_id = 79
24 where
25 f.create_time BETWEEN '2022-02-01' AND '2022-03-01' AND
26 e.value_text LIKE '%D-Flow%'
27 group by a.tn
28 , a.create_time
29 , g.name
30 ) a
31 -- L1第一次转L2的时间
32 left join
33 (
34 select
35 a.ticket_id
36 , min(a.create_time) L12_create_time
37 from
38 ticket_all_working_time a
39 where
40 SUBSTRING_INDEX(a.name, '%%', -2) = 'D-Flow L1%%75'
41 group by a.ticket_id
42 ) b on a.id=b.ticket_id
43
44
45 -- 等待总时长L1
46 left join
47 (
48 SELECT
49 a.ticket_id
50 , sum(a.working_time) L1_pending
51 from
52 ticket_all_working_time a
53 left join
54 (
55 select
56 a.ticket_id
57 , min(a.create_time) L12_create_time
58 from
59 ticket_all_working_time a
60 where
61 SUBSTRING_INDEX(a.name, '%%', -2) = 'D-Flow L1%%75'
62 group by a.ticket_id
63 ) b on a.ticket_id=b.ticket_id
64 inner join
65 (
66 select
67 a.id
68 , a.name state_name
69 , b.name state_type_name
70 from
71 ticket_state a
72 , ticket_state_type b
73 WHERE
74 a.type_id=b.id
75 ) c on a.state_id = c.id
76 where
77 a.create_time <= b.L12_create_time
78 and c.state_type_name='pending auto'
79 and a.queue_id=75
80 group by a.ticket_id
81 ) c on a.id=c.ticket_id
82 -- 转移时长L1
83 left join
84 (
85 SELECT
86 a.ticket_id
87 , sum(a.working_time) L1forward_time
88 from
89 ticket_all_working_time a
90 left join
91 (
92 select
93 a.ticket_id
94 , min(a.create_time) L12_create_time
95 from
96 ticket_all_working_time a
97 where
98 SUBSTRING_INDEX(a.name, '%%', -2) = 'D-Flow L1%%75'
99 group by a.ticket_id
100 ) b on a.ticket_id=b.ticket_id
101 inner join
102 (
103 select
104 a.id
105 , a.name state_name
106 , b.name state_type_name
107 from
108 ticket_state a
109 , ticket_state_type b
110 WHERE
111 a.type_id=b.id
112 ) c on a.state_id = c.id
113 where
114 a.create_time <= b.L12_create_time
115 and c.state_type_name<>'pending auto'
116 and a.queue_id=75
117 group by a.ticket_id
118 ) d on a.id=d.ticket_id

解析如下:

round(x,d) : x指要处理的数,d是指保留几位小数

比如:

ROUND(c.L1_pending/60, 2)

把 c.L1_pending/60 运算后保留两位小数

L12 :L1第一次转L2的时间

L1_pending:L1总时长,单位秒

L23:L2第一次转L3的时间

L23_pending:等待总时长L2,单位秒

秒转为分钟:

L23_pending/60 ,单位分钟

L23_working_time:转移时长L2,单位秒

MAX()函数:返回一组值中的最大值,如果有多个行,只取最大的那一行作为结果

比如:

max(case when IFNULL(f.id,0)<>0 then f.create_time ELSE NULL END) "关闭时间"

在 (如果 f.id 不等于0取创建时间 f.create_time ,如果 f.id 等于0 取NULL)这里面取最大值,


SELECT
a.id
, a.tn
, a.create_time
, case when IFNULL(f.id,0)<>0 then f.create_time ELSE NULL END "关闭时间"
, case when b.field_id=86 then b.value_text else null end 工单来源
, case when b.field_id=255 then b.value_text else null end 模块
, case when b.field_id=240 then b.value_text else null end 解决团队
, g.name 服务水平协议
FROM
ticket a
left join dynamic_field_value b on a.id=b.object_id and b.field_id IN(86,255,240)
right JOIN ticket_history f on a.id = f.ticket_id AND (f.name LIKE '%closed successful%' OR f.name LIKE '%首次电话解决%'OR f.name LIKE '%用户无回应%')
LEFT JOIN sla g ON a.sla_id=g.id
right JOIN dynamic_field_value e ON a.id=e.object_id AND e.field_id = 79
where
f.create_time BETWEEN '2022-02-01' AND '2022-03-01' AND
e.value_text LIKE '%D-Flow%'

SELECT
a.id
, a.tn
, a.create_time
, max(case when IFNULL(f.id,0)<>0 then f.create_time ELSE NULL END) "关闭时间"
, max(case when b.field_id=86 then b.value_text else null end) 工单来源
, max(case when b.field_id=255 then b.value_text else null end) 模块
, max(case when b.field_id=240 then b.value_text else null end) 解决团队
, g.name 服务水平协议
, p.pending_start_time 第一次挂起时间 FROM
ticket a
left join dynamic_field_value b on a.id=b.object_id and b.field_id IN(86,255,240)
right JOIN ticket_history f on a.id = f.ticket_id AND (f.name LIKE '%closed successful%' OR f.name LIKE '%首次电话解决%'OR f.name LIKE '%用户无回应%')
LEFT JOIN sla g ON a.sla_id=g.id
left join ticket_pending_and_work_time p on p.ticket_id=a.id
right JOIN dynamic_field_value e ON a.id=e.object_id AND e.field_id = 79
where
f.create_time BETWEEN '2022-02-01' AND '2022-03-01' AND
e.value_text LIKE '%D-Flow%'
group by a.tn
, a.create_time
, g.name

MIN()函数:返回一组值中的最小值,如果有多个行,会只取最小的那一行作为结果

SUM()函数:返回数值列的总数。如果有多个行,会合并行作为结果

比如:

SELECT
a.ticket_id
,a.working_time
from
ticket_all_working_time a

SELECT
a.ticket_id
,sum(a.working_time) L1_pending
from
ticket_all_working_time a
group by a.ticket_id

CASE WHEN 多个判断条件

IFNULL(expression, alt_value):如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的备用值。

<> :不等于

例如:IFNULL(f.id,0)<>0

如果 f.id 为NULL则返回0,再去比较结果是否等于 0

CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他 case 被忽略

例如:case when IFNULL(f.id,0)<>0 then f.create_time ELSE NULL END

IFNULL(f.id,0):

如果 f.id 为NULL,就返回0,否则返回f.id

IFNULL(f.id,0)<>0:

f.id 不等于0

then f.create_time:如果是,则返回f.create_time

ELSE NULL END:否则返回NULL

OR 满足一个条件即刻

例如:f.name LIKE '%closed successful%' OR f.name LIKE '%首次电话解决%'OR f.name LIKE '%用户无回应%'

f.name 里面包含 closed successful 或者 f.name 里面包含 首次电话解决 或者f.name 里面包含 用户无回应

AND 同时满足前后两个条件

LIKE 匹配/模糊匹配

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

SUBSTRING_INDEX(“待截取有用部分的字符串”,“截取数据依据的字符”,截取字符的位置N)

例如:

SUBSTRING_INDEX(a.name, '%%', -2) = 'D-Flow L1%%75'

把 a.name 从倒数第二个 %% 开始截取,并且截取结果等于 D-Flow L1%%75

group by 当sql语句中有聚合函数时,非聚合字段必须用group by

比如:

select
a.ticket_id
,a.create_time
, min(a.create_time) L12_create_time
from
ticket_all_working_time a
where
SUBSTRING_INDEX(a.name, '%%', -2) = 'D-Flow L1%%75'
group by a.ticket_id,a.create_time

语句中包含聚合函数 min(),所以对于非聚合函数的 a.ticket_id 和 a.create_time 必须用 group by 对结果集进行分组

如果不加,就会报错如下:

[Err] 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sc_otrs.a.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

sql 名词解析的更多相关文章

  1. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  2. SQL 软解析和硬解析详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt329 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个 ...

  3. 区块链名词解析:ICO、IFO、IEO和IMO,分别是什么呢?

    区块链名词解析:ICO.IFO.IEO和IMO,分别是什么呢?本部分给出了标准答案,但其相当枯燥乏味,建议快进. ICO(Initial Coin Offering),首次代币发行,指区块链项目首次向 ...

  4. sql注入解析

    sql注入解析 sql注入解析(一)基本语法 sql注入解析(二)执行注入 sql注入解析(三)数据库类型 sql注入解析(四)避开过滤

  5. sql语句解析顺序和执行顺序

    sql语句执行顺序1.from子句组装来自不同数据源的数据2.where子句基于指定的条件对记录行进行筛选3.group by子句将数据划分为多个分组4.使用聚集函数进行计算5.使用having子句筛 ...

  6. sql 关键字解析

    sql 关键字解析 关键字 解析 union 注意:每个 SELECT 语句,必须列的数量.顺序相同,列的数据类型相似.即:1. UNION 内部的每个 SELECT 语句必须拥有相同数量的列:2. ...

  7. Oracle SQL 硬解析和子游标

    Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一 ...

  8. Java 实现对Sql语句解析

    原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...

  9. 窗口类WNDCLASSEX名词解析

    窗口类WNDCLASSEX名词解析 typedef struct tagWNDCLASSEX{ UINT cbsize; UINT style; WNDPROC lpfnWNDProc; int cb ...

随机推荐

  1. python 小兵(2)

    while 条件: 结构体 if=条件: 等于 while 条件: 结构体 else: print(int(Ture))    1 print(int(False))   0 切片顾头不顾尾 prin ...

  2. Pycharm新建文件时头部模板的配置方法

    方法

  3. APschedule定时任务

    APScheduler是Python的一个定时任务框架,可以很方便的满足用户定时执行或者周期执行任务的需求, 它提供了基于日期date.固定时间间隔interval .以及类似于Linux上的定时任务 ...

  4. 女朋友让我深夜十二点催她睡觉,我有Python我就不干

    事情是这样的:今天晚上,女朋友让我十二点催她睡觉. 不过,可是我实在太困了,熬不下去-- 是吧?女朋友哪有睡觉重要? 但,女朋友的命令,我是不敢违抗的-- 但是睡觉也不能缺! 这时候我们该怎么办呢?是 ...

  5. 鸿蒙轻内核源码分析:文件系统LittleFS

    摘要:本文先介绍下LFS文件系统结构体的结构体和全局变量,然后分析下LFS文件操作接口. 本文分享自华为云社区<# 鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS>,作者: ...

  6. X000011

    P1890 gcd区间 \(\gcd\) 是满足结合律的,所以考虑用 ST 表解决 时间复杂度 \(O((n\log n+m)\log a_i)\) 考虑到 \(n\) 很小,你也可以直接算出所有的区 ...

  7. linux centos6.3 升级svn1.6到svn1.8

    linux centos6.3 升级svn1.6 1. 删除svn1.6 #yum remover subverson12.设置svn1.8安装源 vim /etc/yum.repos.d/wandi ...

  8. Activity有多个启动图标

    (1)如果你想让你的Activity有多个启动图标 需要这样配置 <intent-filter> <action android:name="android.intent. ...

  9. WordPress子模板继承

    很多时候我们不想重写模板,而是想在某个模板的基础上进行修改,那么这个时候我们就需要用到模板继承技巧. 子主题开发 style.css 是必须的文件,只需要新增 Template: 父模板的文件夹名

  10. element ui图片上传方法

    <!--商品图片--> <template v-slot:product_cover> <el-upload list-type="picture-card&q ...