因特殊原因客户需要清理掉畅捷通T+里的数据, 通过SQL语句+存储过程实现快速处理
清理需求
- 清理所有的财务和供应链单据,包括凭证、资产卡片、采购、销售、仓存、核算单据。
- 零售交班、对账、结算数据全部清理,零售单数据按每个门店,每一天单据时间从后至前删除,保留每天总金额的45%的单据。
- 会员数据按每个类别保留45%,需剔除一部分特殊会员
直接上代码
会删除数据,生产环境慎重操作
总账+供应链单据直接TRUNCATE删除,会员数据按比例删除
sql
-- 删除凭证
TRUNCATE table GL_Entry;
TRUNCATE table GL_Doc;
TRUNCATE table GL_AccountPeriodBegin;
-- 资产卡片
TRUNCATE table GL_Entry;
-- 删除资产卡片
TRUNCATE table AM_Attachment;
TRUNCATE table AM_Asset;
-- 进货单
TRUNCATE table PU_PurchaseArrival;
TRUNCATE table PU_PurchaseArrival_b;
TRUNCATE table PU_PurchaseArrival_SourceRelation;
-- 删除预测单
TRUNCATE table MP_IntendSaleOrder_b;
TRUNCATE table MP_IntendSaleOrder;
-- 删除销售订单
TRUNCATE table SA_SaleOrder_SourceRelation;
TRUNCATE table SA_SaleOrder_b ;
TRUNCATE table SA_SaleOrder ;
-- 删除销货单
TRUNCATE table SA_SaleDeliveryPreReceive;
TRUNCATE table SA_SaleDelivery_b;
TRUNCATE table SA_SaleDelivery;
-- 删除要货单
TRUNCATE table DI_StockRequest_b;
TRUNCATE table DI_StockRequest;
-- 删除调拨单
TRUNCATE table ST_TransSourceRelation;
TRUNCATE table ST_TransVoucher_b;
TRUNCATE table ST_TransVoucher;
-- 删除形态转换单
TRUNCATE table ST_ShapeVoucher_b;
TRUNCATE table ST_ShapeVoucher;
-- 删除盘点单
TRUNCATE table ST_CheckVoucher_b;
TRUNCATE table ST_CheckVoucher;
TRUNCATE table ST_AssistantDataBook ;
TRUNCATE table ST_AssistantDataBook ;
TRUNCATE table ST_PartialCheckVoucher ;
TRUNCATE table ST_PartialCheckVoucherDetail ;
-- 删除生产加工单
TRUNCATE table MP_ManufactureOrder_Trace;
TRUNCATE table MP_ManufactureOrder_SourceRelation;
TRUNCATE table MP_ManufactureOrder_Material;
TRUNCATE table MP_ManufactureOrder_b;
TRUNCATE table MP_ManufactureOrder;
--删除零售结算单
TRUNCATE table RE_RetailSettle_b;
TRUNCATE table RE_RetailSettle;
--删除零售交班单
TRUNCATE table RE_ShiftVoucher_b;
TRUNCATE table RE_ShiftVoucher;
--删除零售对账收款
TRUNCATE table RE_ReceiveDetail ;
-- 删除全部出入库单
TRUNCATE TABLE RE_SaleOutRelation; -- 零售单和出入库关系表
TRUNCATE table ST_RDRecordSourceRelation;
TRUNCATE table ST_RDRecord_b;
TRUNCATE table ST_RDRecord;
-- 导入要保留的数据
-- 按分组排序
SELECT
cardcode, -- 会员卡号(对应test1的cnumber)
idmembertype,
-- 每组内随机排序
ROW_NUMBER() OVER (PARTITION BY idmembertype ORDER BY NEWID()) AS Random_Row,
-- 每组总记录数
COUNT(*) OVER (PARTITION BY idmembertype) AS Total_Rows
INTO tmp_xxx
FROM AA_DR_MemberNew
-- 排除已手动保留的ID(避免重复)
WHERE cardcode NOT IN (SELECT cnumber FROM test1 WHERE cnumber IS NOT NULL)
-- 筛选每组前45%的ID,写入test1(标记为自动保留,可选)
INSERT INTO test1 (cnumber)
SELECT DISTINCT cardcode
FROM tmp_xxx
WHERE Random_Row <= CEILING(Total_Rows * 0.45);
-- 删除会员( 先导入会员到test1表)
delete from AA_DR_MemberNew
WHERE cardcode NOT IN (SELECT DISTINCT cnumber FROM test1 WHERE cnumber IS NOT NULL);
--查询账套信息
select * from EAP_Account;
-- 写入要删除的数据汇总
SELECT
idstore,
CONVERT(DATE, voucherdate) AS DealDate, -- 日期字段重命名(便于后续使用)
SUM(totaltaxamount) AS TotalRetailAmount,
0 AS IsProcessed -- 新增INT字段,默认值为0
INTO Retail_Store_Date_Summary -- 新表名
FROM RE_Retail
WHERE idstore NOT IN (3,20,22,26)
AND voucherdate >= '2025-01-01 00:00:00.000'
AND voucherdate < '2026-01-01 00:00:00.000'
GROUP BY idstore, CONVERT(DATE, voucherdate);
-- 查询删除后数据情况
select CAST(t2.mdid AS VARCHAR) , CONVERT(VARCHAR(10), t1.DealDate, 23),
t2.ysje, t1.TotalRetailAmount,t2.ysje / t1.TotalRetailAmount
from RETAIL_STORE_DATE_SUMMARY as t1,
(SELECT
idstore mdid ,CONVERT(DATE, voucherdate) as ysrq , sum(totaltaxamount ) as ysje
FROM RE_Retail
WHERE idstore NOT IN (3,20,22,26)
and voucherdate >= '2024-12-01 00:00:00.000'
and voucherdate < '2024-12-31 00:00:00.000'
group by idstore,CONVERT(DATE, voucherdate) ) as t2
where t1.idstore = t2.mdid
and t1.DealDate = t2.ysrq
and t1.TOTALRETAILAMOUNT > 0
and t2.ysje / t1.TotalRetailAmount != 1 ;
零售单数据按比例保留存储过程
sql
-- 检查存储过程是否存在,如果存在则删除
IF OBJECT_ID('dbo.SP_DELETE_1', 'P') IS NOT NULL
DROP PROCEDURE dbo.SP_DELETE_1
GO
-- 创建存储过程
CREATE PROCEDURE [dbo].[SP_DELETE_1]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@IDSTORE VARCHAR(50),
@DEALDATE NVARCHAR(50),
@TOTALRETAILAMOUNT FLOAT
DECLARE TODO_DELELTE_LIST CURSOR FOR
SELECT
IDSTORE,
DEALDATE,
TOTALRETAILAMOUNT
FROM
RETAIL_STORE_DATE_SUMMARY
WHERE
TOTALRETAILAMOUNT > 0
and DealDate >= '2025-01-01'
and DealDate < '2025-12-31'
and IsProcessed = 0
ORDER BY
DEALDATE DESC,
IDSTORE ASC
OPEN TODO_DELELTE_LIST
FETCH NEXT FROM TODO_DELELTE_LIST INTO @IDSTORE, @DEALDATE, @TOTALRETAILAMOUNT
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '门店' + CAST(@IDSTORE AS VARCHAR) + '准备删除' + @DEALDATE + '零售单' + CAST(@TOTALRETAILAMOUNT AS VARCHAR)
declare todo_pos_list cursor for
select id,totaltaxamount from RE_Retail where idstore=@IDSTORE and CONVERT(DATE, voucherdate)=@DEALDATE and totaltaxamount <> 0 order by id desc;
open todo_pos_list
declare @reid int,@dqtotal FLOAT
DECLARE @deletedAmount FLOAT = 0 -- 已删除金额累计
DECLARE @deletetotalredline FLOAT = @TOTALRETAILAMOUNT * 0.55 -- 删除超过55%阈值就不删了。
fetch next from todo_pos_list into @reid,@dqtotal
WHILE @@FETCH_STATUS = 0 AND @deletedAmount < @deletetotalredline
BEGIN
BEGIN TRANSACTION
-- 执行删除操作
DELETE FROM re_retail_b WHERE idRetailDTO = @reid
DELETE FROM re_retail WHERE id = @reid
PRINT '删除' + CAST(@reid AS VARCHAR) +'金额' + CAST(@dqtotal AS VARCHAR) +'已删除金额' + CAST(@deletedAmount AS VARCHAR)
-- 更新累计删除金额和剩余金额
SET @deletedAmount = @deletedAmount + @dqtotal
COMMIT TRANSACTION
FETCH NEXT FROM todo_pos_list INTO @reid, @dqtotal
END
close todo_pos_list
deallocate todo_pos_list
FETCH NEXT FROM TODO_DELELTE_LIST INTO @IDSTORE, @DEALDATE, @TOTALRETAILAMOUNT
END
CLOSE TODO_DELELTE_LIST
DEALLOCATE TODO_DELELTE_LIST
END
GO
排除部分会员需要导入excel,通过SSMS操作
右键点击数据-任务-导入数据

选择excel

选择SQL需要导入的目标库

命名一下导入的表名即可
