将两个表变量数据合并到第三个表变量中,其中第二个表变量中的记录每 X 行插入一次

问题描述 投票:0回答:1

我有需要为我们的营销客户更新的存储过程。

我有两个表变量,填充没有问题。

目前我有一个 WHILE 循环(见下文),可以毫无问题地将 @SalesTable 内容处理到第三个表变量 @SalesAndAdsTable 中。

现在的问题是尝试在外循环的每 X 次迭代中从第二个表变量 @AdsTable 插入数据。

我的想法是尝试找出两个表之间的行偏移量,并使用该数字作为指示器将 @AdsTable 记录插入到 @SalesAndAdsTable 中。

这是一个好主意还是还有其他方法?

@SalesTable 和 @AdsTable 都被填充后的代码片段如下:

SET @OffSet = (SELECT @SalesTableCnt/@AdsTableCnt);

        WHILE (SELECT COUNT(*) FROM @SalesTable WHERE processed = 0) > 0
        BEGIN

            SELECT TOP 1 @SaleId = saleid FROM @SalesTable WHERE processed = 0 ORDER BY dateadded DESC;

            -- check if @OffSet matches the @SaleCnt, INSERT AD Record into @SalesAndAdsTable, update @AdsTable setting processed = 1, RESET @SaleCnt to 0 

            -- INSERT this SALE record into @SalesAndAdsTable
            INSERT INTO @SalesAndAdsTable SELECT * FROM @SalesTable WHERE saleid = @SaleId;

            -- C. Finally, update the table variable, set the 'Processed' column of the processed row to 1. 
            UPDATE @SalesTable SET processed = 1 Where saleid = @SaleId;


            --AD INJECTION...
            IF @OffSet = @SaleCnt AND @OffSet >= 0
            BEGIN

                SELECT TOP 1 @AdId = saleid FROM @AdsTable WHERE processed = 0 ORDER BY dateadded DESC;;
        
                -- INSERT this AD record into @SalesAndAdsTable
                INSERT INTO @SalesAndAdsTable SELECT * FROM @AdsTable WHERE @AdId = saleid;

                UPDATE @AdsTable SET processed = 1 Where saleid = @AdId; 

                SET @SaleCnt = 0;
                SET @AdCnt = @AdCnt + 1;
                
                --SELECT @AdId as '@AdId';

            END

            -- increase this loops counter variable
            SET @SaleCnt = @SaleCnt + 1;

            --SELECT @SaleCnt as '@SaleCnt', @OffSet as '@OffSet', @SaleId as '@SaleId';

        END

目前,所有必需的记录都已插入到 @SalesAndAdsTable 中,但前两条广告记录似乎是同时插入的。我想我已经很接近了。

感谢您的任何建议,乔

sql sql-server loops variables while-loop
1个回答
0
投票

在没有看到一些示例数据和预期结果的情况下,我不确定您到底想要实现什么目标,但您似乎希望在销售记录中均匀分布广告记录??

如果添加的日期是主要排序,那么只需在最终的 ORDER BY 中更改它,在这种情况下,您可能不需要任何偏移代码(但我再次猜测。

如果这没有帮助,请显示一些示例数据和预期结果。

如果这是正确的那么这应该可以解决问题

-- Set up some sample data

DECLARE @Sales TABLE (SaleID int, DateAdded date, SomeText varchar(10), SomeNumber decimal(10,2))
DECLARE @Ads TABLE (AdID int, DateAdded date, SomeText varchar(10), SomeNumber decimal(10,2))

INSERT INTO @Sales VALUES 
(50, '2023-09-15', 'Sale', 11.1), (30, '2023-09-16', 'Sale', 22.2), (35, '2023-09-17', 'Sale', 33.3), (8,  '2023-09-18', 'Sale', 44.4), 
(9,  '2023-09-19', 'Sale', 55.5), (55, '2023-09-20', 'Sale', 66.6), (99, '2023-09-21', 'Sale', 77.7), (33, '2023-09-22', 'Sale', 88.8)

INSERT INTO @Ads VALUES (1, '2023-09-15', 'Ad', 1.1), (2, '2023-09-20', 'Ad', 2.2),(3, '2023-09-21', 'Ad', 3.3)

-- The query

DECLARE @Offset Decimal(10,5) = ((SELECT CAST(COUNT(*) as decimal(10,5)) FROM @Sales) / ((SELECT CAST(COUNT(*) as decimal(10,5)) FROM @Ads)))

select *, ROW_NUMBER() OVER(ORDER BY DateAdded DESC) as rn from @Sales
UNION ALL
select *, (ROW_NUMBER() OVER(ORDER BY DateAdded DESC) * @Offset) + 0.00001 as rn from @Ads
ORDER BY rn
    

第一部分只是设置一些示例数据。我在每个表格中都包含了“销售”或“广告”一词,以便结果更易于阅读。

秒部分只有两个语句,第一个获取偏移量,第二个仅执行两个查询的并集。

如果这是在一个大表上工作,这应该比循环快得多(这通常是一个坏主意)。

这是结果。

© www.soinside.com 2019 - 2024. All rights reserved.