畅捷通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需要导入的目标库

命名一下导入的表名即可

相关推荐
ttthe_MOon2 小时前
MySQL 高阶查询语句:子查询、连接查询与多表关联
数据库·sql
Hello.Reader4 小时前
Flink SQL 窗口函数从 OVER 到 TopN 的完整套路
java·sql·flink
蝈蝈(GuoGuo)4 小时前
FireDAC][Phys][ODBC][SQLSRV32.DLL] SQL_NO_DATA FDquery
数据库·sql·oracle
Hello.Reader5 小时前
Flink SQL Join 从 Regular Join 到 Temporal Join 的实战
网络·sql·flink
曲幽5 小时前
Flask数据库操作进阶:告别裸写SQL,用ORM提升开发效率
python·sql·sqlite·flask·web·sqlalchemy
说私域5 小时前
从营销效率到零售效率:开源AI智能名片链动2+1模式与S2B2C商城小程序驱动的渠道裂变新范式
人工智能·小程序·零售
humstone5 小时前
基于xml 和sql 实现自定义报表查询
xml·数据库·sql
释怀°Believe19 小时前
javaweb
数据库·sql·oracle
wuxuanok20 小时前
ThinkPHP ——安装部署与配置
sql·mysql·nginx·php