oracle 常见sql 解析

sql 复制代码
SELECT trackInTime, trackOutTime, trackInQty, trackOutQty, stepNo, woId, partNo, lotId, eqpCode, stepName, standardTime, createBy
FROM
(
    SELECT TO_CHAR(MIN(CASE WHEN OPERATION = 'IN' THEN lh.CREATED END), 'YYYY-MM-DD HH24:MI:SS') AS trackInTime,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'OUT' THEN lh.CREATED END), 'YYYY-MM-DD HH24:MI:SS') AS trackOutTime,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'IN' THEN lh.TRACK_IN_QTY END)) AS trackInQty,
           TO_CHAR(MAX(CASE WHEN OPERATION = 'OUT' THEN lh.TRACK_OUT_QTY END)) AS trackOutQty,
           lh.STEP_NAME AS stepNo,
           lh.WO_ID AS woId,
           lh.PART_NO AS partNo,
           lh.LOT_ID AS lotId,
           lh.EQP_CODE AS eqpCode,
           ro.OP_NAME AS stepName,
           pt.CANON_TIME AS standardTime,
           LISTAGG(lh.CREATE_BY, ',') WITHIN GROUP (ORDER BY lh.CREATE_BY) AS createBy
    FROM
    (
        SELECT lh.*,
               ROW_NUMBER() OVER (PARTITION BY lh.CREATED, lh.CREATE_BY ORDER BY lh.CREATED) AS rn
        FROM R_WIP_LOT_HIS lh
    ) lh
    LEFT JOIN C_ROU_OPER ro ON lh.STEP_NAME = ro.OP_ID
    LEFT JOIN C_CANON_PART_TIME pt ON pt.STEP_NAME = lh.STEP_NAME AND pt.PART_NO = lh.PART_NO
    WHERE lh.rn = 1
      AND (lh.OPERATION = '入站' OR lh.OPERATION = '出站')
  
    GROUP BY lh.STEP_NAME, lh.WO_ID, lh.PART_NO, lh.LOT_ID, lh.EQP_CODE, ro.OP_NAME, pt.CANON_TIME, lh.TASK_ID
) tmp_count WHERE trackInTime BETWEEN '2024-06-14' AND '2024-09-09'

1. 数据表及字段说明

R_WIP_LOT_HIS表包含有关生产过程中每个批次历史记录的数据。

C_ROU_OPER表包含生产工步的操作信息。

C_CANON_PART_TIME表包含标准时间信息。
2. 子查询

第一个子查询lh中,使用ROW_NUMBER()对历史记录进行编号,以便在后续查询中使用。
3. 主查询

主查询从子查询lh中选择相关字段,并根据OPERATION为"入站"或"出站"以及数据行号为1的条件过滤数据。

使用TO_CHAR函数将CREATED字段转换为指定格式的trackInTime和trackOutTime。

通过MAX(CASE WHEN OPERATION = '入站' THEN lh.TRACK_IN_QTY END)和MAX(CASE WHEN OPERATION = '出站' THEN lh.TRACK_OUT_QTY END)获取trackInQty和trackOutQty。

通过LEFT JOIN操作连接C_ROU_OPER和C_CANON_PART_TIME表,以获取stepName、standardTime等字段信息。

使用LISTAGG函数将CREATE_BY字段聚合为逗号分隔的字符串。

最后,通过GROUP BY对结果进行分组。
4. 条件筛选

主查询中添加条件trackInTime BETWEEN '2024-06-14' AND '2024-09-09'以筛选出特定日期范围内的数据。

通过以上分析,可以看出该SQL语句的主要目的是从不同数据表中检索特定日期范围内相关生产工步的进出站信息及其他相关字段。

在上面的SQL查询语句中,涉及到了以下一些SQL函数,下面将对这些函数进行详细解释,并提供相近的函数作为参考:

TO_CHAR(date, format): 将日期类型转换为字符类型,格式由第二个参数指定。例如,TO_CHAR(lh.CREATED, 'YYYY-MM-DD HH24:MI:SS')将日期转换为YYYY-MM-DD HH24:MI:SS格式的字符串。

相近函数:TO_DATE(string, format): 将字符类型转换为日期类型,格式由第二个参数指定。例如,TO_DATE('2024-06-14', 'YYYY-MM-DD')将字符串转换为日期格式。 CASE WHEN condition THEN result END:

根据条件进行判断,符合条件返回相应的值。在SQL中,通过CASE WHEN语句进行条件判断和赋值操作。

相近函数:COALESCE(value1, value2): 返回参数值中的第一个非空值。如果参数值都为NULL,则返回NULL。 ROW_NUMBER() OVER (PARTITION BY

... ORDER BY ...) AS rn: 为结果集中的行数按指定的条件进行排序,并为每行分配一个唯一序号。

相近函数:RANK() OVER (PARTITION BY ... ORDER BY ...) AS rnk: 类似于ROW_NUMBER(),但如果存在并列名次,则会跳过相等的排名。

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY ...): 将查询结果集中的行合并为一个单独的字符串,使用特定的分隔符。

ORDER BY子句用于对合并的结果进行排序。

相近函数:GROUP_CONCAT(expression ORDER BY ... SEPARATOR ... ): 用于MySQL,类似于LISTAGG函数,将多行数据合并为一个字符串,并使用指定的分隔符分隔。

相关推荐
李大玄1 小时前
Google浏览器拓展工具 "GU"->google Utils
前端·javascript·github
每天吃饭的羊1 小时前
github上部署自己的静态项目
github
泰勒朗斯2 小时前
如何在新机器上设置github完成内容git push
git·github
qianmoQ2 小时前
GitHub 趋势日报 (2025年07月05日)
github
weixin_307779133 小时前
批量OCR的GitHub项目
python·github·ocr
发仔1234 小时前
Oracle与MySQL核心差异对比
mysql·oracle
前端 贾公子5 小时前
monorepo + Turborepo 缓存
github
GEEK零零七5 小时前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode
独立开阀者_FwtCoder6 小时前
放弃 JSON.parse(JSON.stringify()) 吧!试试现代深拷贝!
前端·javascript·github
椰椰椰耶6 小时前
【MyBatis】XML实现,配置方法和增、删、改、查
xml·oracle·mybatis