sql 名词解析
针对这个 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 名词解析的更多相关文章
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- SQL 软解析和硬解析详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt329 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个 ...
- 区块链名词解析:ICO、IFO、IEO和IMO,分别是什么呢?
区块链名词解析:ICO.IFO.IEO和IMO,分别是什么呢?本部分给出了标准答案,但其相当枯燥乏味,建议快进. ICO(Initial Coin Offering),首次代币发行,指区块链项目首次向 ...
- sql注入解析
sql注入解析 sql注入解析(一)基本语法 sql注入解析(二)执行注入 sql注入解析(三)数据库类型 sql注入解析(四)避开过滤
- sql语句解析顺序和执行顺序
sql语句执行顺序1.from子句组装来自不同数据源的数据2.where子句基于指定的条件对记录行进行筛选3.group by子句将数据划分为多个分组4.使用聚集函数进行计算5.使用having子句筛 ...
- sql 关键字解析
sql 关键字解析 关键字 解析 union 注意:每个 SELECT 语句,必须列的数量.顺序相同,列的数据类型相似.即:1. UNION 内部的每个 SELECT 语句必须拥有相同数量的列:2. ...
- Oracle SQL 硬解析和子游标
Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一 ...
- Java 实现对Sql语句解析
原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...
- 窗口类WNDCLASSEX名词解析
窗口类WNDCLASSEX名词解析 typedef struct tagWNDCLASSEX{ UINT cbsize; UINT style; WNDPROC lpfnWNDProc; int cb ...
随机推荐
- markdown介绍和使用(超全建议收藏)
Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...
- AT2651 [ARC077D] SS
定义 \(nxt_i\) 表示在字符串 \(S\) 中以 \(i\) 结尾的最长 \(border\). 引理一:若 \(n - nxt_n \mid n\) 则 \(S_{1 \sim n - nx ...
- windows10使用wireshark抓取本机请求包
1.管理员运行cmd 右键左下角windows图标,管理员运行Windows PowerShell 2.输入ipconfg查看本机ip和网关ip 3.执行命令 route add 本机ip mask ...
- JAVA多线程学习十三 - 同步工具CyclicBarrier与CountDownLatch
一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...
- iOS 学习资料Blog 技术论坛等,不断添加中。。。。
iOS 学习资料整理 http://www.jianshu.com/p/dc81698a873c 中文 iOS/Mac 开发博客列表 https://github.com/tangqiaobo ...
- DNS域名解析之正向解析
DNS域名解析之正向解析 1.DNS介绍 2.DNS正向解析实验 1.DNS定义:DNS是"域名系统"的英文缩写.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地 ...
- python基础——反射
反射:利用字符串的形式去对象(模块)中操作(寻找|检查|设置|删除)成员 getattr(commons,"login") #在commons模块中找成员login hasattr ...
- 汉明码、海明校验码(Hamming Code)
目录 基础知识 汉明码/海明校验码 计算 基础知识 码距:又叫海明距离,是在信息编码中,两个编码之间对应位上编码不同的位数.例如编码100110和010101,第1.2.5.6位都不相同,所以这两个编 ...
- JMeter使用流程
JMeter使用流程 首先我们要新建一个线程组,线程组的作用模拟多个访问对象,对系统可以进行压力测试 添加"HTTP Cookie管理器": 添加"Http请求默认值&q ...
- Oracle - Trunc() 函数截取日期&截取数值
Oracle TRUNC函数可以截取数字和日期类型:截取日期:select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; --显示当前时间 s ...