畅捷通T+按一定比例删除零售单和会员数据

因特殊原因客户需要清理掉畅捷通T+里的数据, 通过SQL语句+存储过程实现快速处理

清理需求

  1. 清理所有的财务和供应链单据,包括凭证、资产卡片、采购、销售、仓存、核算单据。
  2. 零售交班、对账、结算数据全部清理,零售单数据按每个门店,每一天单据时间从后至前删除,保留每天总金额的45%的单据。
  3. 会员数据按每个类别保留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需要导入的目标库

命名一下导入的表名即可

相关推荐
小句19 小时前
SQL中JOIN语法详解 GROUP BY语法详解
数据库·sql
昊昊该干饭了20 小时前
一个真实查询需求如何从表设计走到高效 SQL
数据库·sql
Elastic 中国社区官方博客1 天前
使用瑞士风格哈希表实现更快的 ES|QL 统计
大数据·数据结构·sql·elasticsearch·搜索引擎·全文检索·散列表
pengweizhong1 天前
Dynamic‑SQL2 查询篇:MyBatis 增强利器,让 SQL 像写 Java 一样丝滑
java·sql·教程
逍遥德1 天前
Postgresql 系统表作用解释
数据库·后端·sql·postgresql
SJLoveIT1 天前
sql注入攻击的防御思路总结
数据库·sql
Geek攻城猫1 天前
深入理解 SQL 多字段排序:从基础到高级技巧
数据库·sql
BD_Marathon1 天前
动态SQL(七)sql标签
服务器·sql·性能优化
Hello.Reader1 天前
Flink OpenSearch SQL Connector Append/Upsert、动态索引、Exactly-Once 与性能调参
大数据·sql·flink
枷锁—sha1 天前
【Vulhub】Discuz! 7.2 faq.php SQL 注入深度复现手册 (转义逃逸篇)
数据库·sql·php