[MySQL] Almacenamiento: mantenga el flujo de entrada y salida, el inventario, la deduplicación y la corrección de la lógica de cantidad

serie de artículos

Biblioteca subyacente de C#: clase de construcción de script MySQLBuilder (seleccionar, insertar, actualizar, generar automáticamente SQL con condiciones)
enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/129179216


Biblioteca subyacente de C#: enlace de clase auxiliar de operación de base de datos MySQL (lectura recomendada) a este artículo: https://blog.csdn.net/youcheng_ge/article/details/126886379

Biblioteca subyacente de C#: el uso de SQLite (pequeña base de datos local)
enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/123666958

[Mejorar la eficiencia de la programación] Importe datos de Excel a la base de datos en lotes
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/126427323

[Oracle] El servidor de la base de datos restringe el acceso IP al
enlace de este artículo: https://blog.csdn.net/youcheng_ge/article/details/122220930

[Oracle] Tutorial de importación de datos de Excel
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/118722756

[Oracle] Tutorial de restauración de base de datos_bomba de datos
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/118054855

[SQL] Cómo consultar campos de tablas e identificar claves principales
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/110820405

[SQL] Uso de aplicación externa
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/79903489

[SQL] Procesamiento de datos duplicados de conexión de múltiples tablas
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/79903619

Enlace del tutorial de instalación de MySQL (detallado)
a este artículo: https://blog.csdn.net/youcheng_ge/article/details/126037520

Enlace del tutorial de desinstalación de MySQL (detallado)
a este artículo: https://blog.csdn.net/youcheng_ge/article/details/129279265

[MySQL] ¿Cómo agregar el campo "total" para grupo por clasificación y resumen?
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/128217837

[MySQL] Uso de CON CHECK OPTION
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/128147196

[MySQL] ¿Cómo mejorar la eficiencia mediante el uso de procedimientos almacenados para insertar decenas de millones de datos?
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/77728189

[MySQL] Realización de la transposición de filas y columnas de la tabla de la base de datos
Enlace a este artículo: https://blog.csdn.net/youcheng_ge/article/details/77625052

[MySQL] En la consulta, el valor NULL se convierte en una cadena vacía
Este enlace: https://blog.csdn.net/youcheng_ge/article/details/130381878


prefacio

Esta columna es [Base de datos], que presenta principalmente las funciones y características de SQL, lenguaje de definición de datos SQL (tabla, vista, índice, restricción), lenguaje de operación de datos SQL (recuperación de datos, inserción de datos, eliminación de datos, actualización de datos), creación. y activadores de eliminación, lenguaje de control de datos SQL (seguridad y autorización, procesamiento de transacciones) y SQL incorporado.
Si está interesado en este álbum, continúe prestando atención. Si tiene alguna pregunta, también puede enviarnos su opinión en el área de comentarios y enviarme un mensaje privado.
inserte la descripción de la imagen aquí

1. Introducción técnica

Usando el método de la tabla de respaldo, copie la tabla de respaldo vacía, extraiga los registros duplicados, inserte la tabla de respaldo después de la deduplicación, elimine todos los registros duplicados en la tabla original y luego vuelva a insertar la tabla original de registros de la tabla de respaldo (registros no duplicados).

2. Preparación de datos

inserte la descripción de la imagen aquí

3. Soluciones

3.1 20230803

-- 手动核实 出入库流水、以及产品信息表数据
-- 1、维护出库流水表
-- 出现出库流水记录存在,但是模具信息表不存在的情况,出库流水一律删除
-- 单号 TOM开头为模具领用

SELECT *
FROM 模具出入库表 a
LEFT JOIN 模具信息表 b ON a.模具编号=b.模具编号 
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
AND b. 模具编号 IS NULL

-- 2、从备份表中,找到缺失的模具信息数据
-- 模具信息表,不存在
SELECT * 
FROM 模具信息表
WHERE 模具编号 ='YP2ACX230322699'

-- 模具信息表_原,存在
SELECT * 
FROM 模具信息表_原
WHERE 模具编号 ='YP2ACX230322699'


SELECT c.模具编号,c.模具出厂编号,c.模具供应商编号,c.* 
FROM 模具出入库表 a
LEFT JOIN 模具信息表 b ON a.模具编号=b.模具编号 
LEFT JOIN 模具信息表_原 c ON a.模具编号=c.模具编号 
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
AND b.模具编号 IS NULL AND c.模具编号 IS NOT NULL

-- 3、验证2的合理性
-- 模具信息表,不存在
SELECT * 
FROM 模具信息表
WHERE 模具编号 ='YP2ACX230303306'

-- 模具信息表_原,存在
SELECT * 
FROM 模具信息表_原
WHERE 模具编号 ='YP2ACX230303306'

-- 模具信息表,不存在
SELECT * 
FROM 模具信息表
WHERE 模具编号 ='HP1AAXJC20230893'

-- 模具信息表_原,存在
SELECT * 
FROM 模具信息表_原
WHERE 模具编号 ='HP1AAXJC20230893'


-- 4、增补模具信息表缺失的数据
INSERT INTO `dl_mes`.`模具信息表` (`公司编号`, `工厂名称`, `存货编码`, `采购订单编号`, `领用申请单编号`, `销售订单编号`, `模具供应商编号`, `模具类别`, `模具类型`, `模具材质`, `模具出厂编号`, `模具出厂规格`, `模具出厂直径`, `返修次数`, `模具编号`, `模链编号`, `模具标准规格`, `模具规格`, `模具标准直径`, `模具直径`, `模芯规格`, `粒度`, `状态描述`, `库存状态`, `仓库编号`, `货位编号`, `设备编号`, `下盘编号`, `下盘规格`, `累计公里数`, `累计盘数`, `行动`, `模具打标时间`, `模具打标录入时间`, `模具打标操作人编号`, `模具打标备注`, `模具检验时间`, `模具检验录入时间`, `模具检验人编号`, `异常类型`, `特殊检验说明`, `模具检验备注`, `最小直径`, `最大直径`, `平均直径`, `椭圆度`, `椭圆率`, `左定径长度`, `右定径长度`, `定径长度`, `有效值`, `定径区AR`, `左压缩角`, `右压缩角`, `压缩角`, `压缩区AR1`, `压缩区AR2`, `孔偏角X`, `孔偏角Y`, `倍率`, `检验结果`, `模具首次入库时间`, `领用类型`, `模具领用时间`, `模具领用录入时间`, `模具领用人编号`, `模具领用备注`, `模具退库时间`, `模具退库录入时间`, `模具退库操作人编号`, `模具退库原因`, `模具退库备注`, `模具采购退货时间`, `模具采购退货录入时间`, `模具采购退货操作人编号`, `模具采购退货原因`, `模具采购退货备注`, `模具报废时间`, `模具报废录入时间`, `模具报废操作人编号`, `模具报废原因`, `模具报废备注`) 

SELECT c.`公司编号`, c.`工厂名称`, c.`存货编码`, c.`采购订单编号`, c.`领用申请单编号`, c.`销售订单编号`, c.`模具供应商编号`, c.`模具类别`, c.`模具类型`, c.`模具材质`, c.`模具出厂编号`, c.`模具出厂规格`, c.`模具出厂直径`, c.`返修次数`, c.`模具编号`, c.`模链编号`, c.`模具标准规格`, c.`模具规格`, c.`模具标准直径`, c.`模具直径`, c.`模芯规格`, c.`粒度`, c.`状态描述`, c.`库存状态`, c.`仓库编号`, c.`货位编号`, c.`设备编号`, c.`下盘编号`, c.`下盘规格`, c.`累计公里数`, c.`累计盘数`, c.`行动`, c.`模具打标时间`, c.`模具打标录入时间`, c.`模具打标操作人编号`, c.`模具打标备注`, c.`模具检验时间`, c.`模具检验录入时间`, c.`模具检验人编号`, c.`异常类型`, c.`特殊检验说明`, c.`模具检验备注`, c.`最小直径`, c.`最大直径`, c.`平均直径`, c.`椭圆度`, c.`椭圆率`, c.`左定径长度`, c.`右定径长度`, c.`定径长度`, c.`有效值`, c.`定径区AR`, c.`左压缩角`, c.`右压缩角`, c.`压缩角`, c.`压缩区AR1`, c.`压缩区AR2`, c.`孔偏角X`, c.`孔偏角Y`, c.`倍率`, c.`检验结果`, c.`模具首次入库时间`, c.`领用类型`, c.`模具领用时间`, c.`模具领用录入时间`, c.`模具领用人编号`, c.`模具领用备注`, c.`模具退库时间`, c.`模具退库录入时间`, c.`模具退库操作人编号`, c.`模具退库原因`, c.`模具退库备注`, c.`模具采购退货时间`, c.`模具采购退货录入时间`, c.`模具采购退货操作人编号`, c.`模具采购退货原因`, c.`模具采购退货备注`, c.`模具报废时间`, c.`模具报废录入时间`, c.`模具报废操作人编号`, c.`模具报废原因`, c.`模具报废备注` 
FROM 模具出入库表 a
LEFT JOIN 模具信息表 b ON a.模具编号=b.模具编号 
LEFT JOIN 模具信息表_原 c ON a.模具编号=c.模具编号 
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
AND b.模具编号 IS NULL AND c.模具编号 IS NOT NULL

-- 5、维护入库流水表
-- 有出库流水数据,必然有入库流水,查找入库流水缺失情况
-- 模具出库流水
SELECT
*
FROM 模具出入库表 a
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
-- 模具入库流水
SELECT
*
FROM 模具出入库表 b 
WHERE b.出入库单据编号 LIKE 'BIM%' AND b.出入库类型='采购入库'


SELECT
a.*
FROM

(
SELECT * 
FROM 模具出入库表 a
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
) a
LEFT JOIN
(
SELECT *
FROM 模具出入库表 b 
WHERE b.出入库单据编号 LIKE 'BIM%' AND b.出入库类型='采购入库'
) b ON a.模具编号 = b.模具编号

WHERE b.模具编号 IS NULL

模具入库流水,缺2条数据,模具编号如下:
DQP1BAX230506101
DQP1AAXD30627054

-- 6、补齐入库流水数据
SELECT *
FROM 模具出入库表_原 b 
WHERE 
-- b.出入库单据编号 LIKE 'BIM%' AND 
b.出入库类型='采购入库'
AND b.模具编号 IN('DQP1BAX230506101','DQP1AAXD30627054')


INSERT INTO `dl_mes`.`模具出入库表` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`) VALUES ('Z', '', '空', '空', '空', 'BIM202307049', '采购入库', '03010114', '09', '09', 'DQP1AAXD30627054', 1.000, '2023-07-30 20:02:21', '2023-07-30 20:02:23', 'developer', 'developer', '模具入库');
INSERT INTO `dl_mes`.`模具出入库表` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`) VALUES ('Z', '', '空', '空', '空', 'BIM202307052', '采购入库', '03010114', '09', '09', 'DQP1BAX230506101', 1.000, '2023-07-31 17:41:28', '2023-07-31 17:41:28', 'developer', 'developer', '模具入库');

-- 7、检验 出库流水、入库流水是否有对应
-- 有出库,必然有入库
-- 有入库,不一定有出库
-- 结存数量+出库数=入库数量
SELECT
a.*
FROM

(
SELECT * 
FROM 模具出入库表 a
WHERE a.出入库单据编号 LIKE 'TOM%' AND a.出入库类型='材料领用出库'
) a
LEFT JOIN
(
SELECT *
FROM 模具出入库表 b 
WHERE b.出入库单据编号 LIKE 'BIM%' AND b.出入库类型='采购入库'
) b ON a.模具编号 = b.模具编号

WHERE b.模具编号 IS NULL

结论:无数据,证明出入库流水正确。

3.2 20230804

-- 1、不该入库的产生入库流水,模具编号还是空的,不应该入库
SELECT * 
FROM 模具出入库表
WHERE 模具编号='空'

DELETE FROM 模具出入库表 WHERE 模具编号='空'


-- 2、入库流水重复的数据,模具编号、出入库录入时间,完全一致的数据可判断为重复纪录
SELECT 模具出入库表.模具编号,COUNT(模具编号) 
FROM 模具出入库表
WHERE 出入库类型='采购入库'
GROUP BY 出入库单据编号,模具编号,出入库录入时间 HAVING COUNT(模具编号)>1;

-- 606条


-- 3、入库流水重复的数据,去重后的记录,保存进 模具出入库表_copy1
INSERT INTO `dl_mes`.`模具出入库表_copy1` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 模具出入库表
WHERE 出入库类型='采购入库'
GROUP BY 出入库单据编号,模具编号,出入库录入时间 HAVING COUNT(模具编号)>1;

-- 606条


-- 4、查询 模具出入库表,存在重复的数据,全部删除
SELECT a.* 
FROM 模具出入库表 a
INNER JOIN 模具出入库表_copy1 b 
ON a.出入库单据编号=b.出入库单据编号 
AND a.模具编号=b.模具编号
AND a.出入库录入时间=b.出入库录入时间
WHERE a.出入库类型='采购入库'

-- 1228条


-- 5、步骤4的数据,全部删除(无法执行)
DELETE FROM 模具出入库表 a
INNER JOIN 模具出入库表_copy1 b 
ON a.出入库单据编号=b.出入库单据编号 
AND a.模具编号=b.模具编号
AND a.出入库录入时间=b.出入库录入时间
WHERE a.出入库类型='采购入库'


-- 6、重新插入不重复的606条,即步骤3的数据
INSERT INTO `dl_mes`.`模具出入库表` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 模具出入库表_copy1


-- 7、出库流水重复的数据,模具编号、出入库录入时间,完全一致的数据可判断为重复纪录
SELECT 模具出入库表.模具编号,COUNT(模具编号) 
FROM 模具出入库表
WHERE 出入库类型='材料领用出库'
GROUP BY 出入库单据编号,模具编号,出入库录入时间 HAVING COUNT(模具编号)>1;

-- 605条


-- 8、出库流水重复的数据,去重后的记录,保存进 模具出入库表_copy1
INSERT INTO `dl_mes`.`模具出入库表_copy1` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 模具出入库表
WHERE 出入库类型='材料领用出库'
GROUP BY 出入库单据编号,模具编号,出入库录入时间 HAVING COUNT(模具编号)>1;


-- 9、查询 模具出入库表,存在重复的数据,全部删除
SELECT a.* 
FROM 模具出入库表 a
INNER JOIN 模具出入库表_copy1 b 
ON a.出入库单据编号=b.出入库单据编号 
AND a.模具编号=b.模具编号
AND a.出入库录入时间=b.出入库录入时间
WHERE a.出入库类型='材料领用出库'

-- 1226条

-- 10、重新插入不重复的605条,即步骤3的数据
INSERT INTO `dl_mes`.`模具出入库表` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库单据编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `模具编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 模具出入库表_copy1


-- 11、物料出入库 与 模具入库流水,库存数对不上的处理
SELECT 出入库单据编号,存货编码,SUM(数量) AS '数量',MAX(出入库时间),MAX(出入库录入时间)
FROM 模具出入库表
WHERE 出入库类型='采购入库'
GROUP BY 出入库单据编号,存货编码
-- 84条

-- 将84条数据备份,转储至 物料出入库表_copy1
INSERT INTO `dl_mes`.`物料出入库表_copy1` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)

SELECT 公司编号,采购订单编号,产成品入库单编号,领料申请单编号,销售订单编号,
出入库类型,存货编码,仓库编号, 货位编号,SUM(数量) AS '数量',
MAX(出入库时间) AS '出入库时间',MAX(出入库录入时间) AS '出入库录入时间',
出入库操作人编号, 库管员编号, 出入库备注
FROM 模具出入库表
WHERE 出入库类型='采购入库'
GROUP BY 出入库单据编号,存货编码

-- 12、删除 物料出入库中,模具入库的记录,重新导入84条数据备份
SELECT * FROM 物料出入库表 WHERE 出入库备注='模具入库'
DELETE FROM 物料出入库表 WHERE 出入库备注='模具入库'

INSERT INTO `dl_mes`.`物料出入库表` ( `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`) 
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 物料出入库表_copy1


-- 13、物料出入库 与 模具入库流水,库存数对不上的处理
SELECT 出入库单据编号,存货编码,SUM(数量) AS '数量',MAX(出入库时间),MAX(出入库录入时间)
FROM 模具出入库表
WHERE 出入库类型='材料领用出库'
GROUP BY 出入库单据编号,存货编码
-- 153条

-- 将 153条数据备份,转储至 物料出入库表_copy1
INSERT INTO `dl_mes`.`物料出入库表_copy1` (`公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`)

SELECT 公司编号,采购订单编号,产成品入库单编号,领料申请单编号,销售订单编号,
出入库类型,存货编码,仓库编号, 货位编号,SUM(数量) AS '数量',
MAX(出入库时间) AS '出入库时间',MAX(出入库录入时间) AS '出入库录入时间',
出入库操作人编号, 库管员编号, 出入库备注
FROM 模具出入库表
WHERE 出入库类型='材料领用出库'
GROUP BY 出入库单据编号,存货编码


-- 14、删除 物料出入库中,模具出库的记录,重新导入 153条数据备份
SELECT * FROM 物料出入库表 WHERE 出入库备注='模具领用出库'
DELETE FROM 物料出入库表 WHERE 出入库备注='模具领用出库'

INSERT INTO `dl_mes`.`物料出入库表` ( `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`) 
SELECT `公司编号`, `采购订单编号`, `产成品入库单编号`, `领料申请单编号`, `销售订单编号`, `出入库类型`, `存货编码`, `仓库编号`, `货位编号`, `数量`, `出入库时间`, `出入库录入时间`, `出入库操作人编号`, `库管员编号`, `出入库备注`
FROM 物料出入库表_copy1


Cuatro, resumen de uso

Deduplicación de datos
Datos duplicados en el flujo entrante
Datos duplicados en el flujo saliente

Supongo que te gusta

Origin blog.csdn.net/youcheng_ge/article/details/132089113
Recomendado
Clasificación