根据 table 中的价值存在采取不同的行动

Take different actions depending on value presence in table

我有 table 我在其他 tables:

中添加特定列值的更改

更新日志表:

TableName ColumnFilter FilterName FilterValue Difference Date
Fruits FruitName Apple 4 0 1/13/2021
Fruits FruitName Pear 5 0 1/13/2021

当我根据 tables 的最后更新日期插入新记录时,我无法确定插入条件。

例如,昨天我的库存 Apples 等于 4,今天是 5。因此,在我的 UpdatesLog table 中,我将插入 Fruits-FruitName-Apple-5。在 Difference 列中,我将计算昨天和今天的值之间的差异,即 1。这没问题,因为我已经将 Apple 作为 FilterName 列中的值。

但是如果我在 Fruits table 的最后一次更新中添加了新的 FruitName - Peach我应该如何检查该值不存在并使用默认值添加它 Difference value equal to 0?

以下是 1 月 14 日的最后更新:

Fruits FruitsInventory LastUpdateDate
Apple 5 1/14/2021
Pear 9 1/14/2021
Peach 10 1/14/2021

这是我期待的结果:

TableName ColumnFilter FilterName FilterValue Diff Date
Fruits FruitName Apple 4 0 1/13/2021
Fruits FruitName Pear 5 0 1/13/2021
Fruits FruitName Apple 5 1 1/14/2021
Fruits FruitName Pear 9 4 1/14/2021
Fruits FruitName Peach 10 0 1/14/2021

这是我的代码,以防我不检查水果名称是否存在:

INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
SELECT [TableName]
    , [ColumnFilter]
    , [FilterName]
    , [FilterValue]
    , [Difference]
    , LUP as [Date]
FROM (
    SELECT tr.TableName
    , tr.ColumnFilter
    , tr.FilterName
    , tr.FilterValue
    , tr.[FilterValue] - ult.[FilterAbsValue] AS [Difference]
    , LUP
    FROM (SELECT
                'Fruits' as [TableName]
                , 'FruitName' as [ColumnFilter]
                ,  FruitName as [FilterName]
                , FruitsInventory AS [FilterValue]
                , MAX(LastUpdateDate as date) as LUP
            FROM Fruits  
            WHERE 1=1
            ) tr
    RIGHT JOIN UpdatesLogTable ult 
    ON tr.TableName = ult.TableName and tr.ColumnFilter = ult.ColumnFilter 
    WHERE hus.LastUpdateDate = (SELECT MAX(CAST(LastUpdateDate as date)) FROM UpdatesLogTable)
) a

我正在考虑 LEFT 或 RIGHT 连接,但这只有在我知道水果品种是增加还是减少时才有效。

你问题中的代码比较混乱。例如:

  • #HistoryUpdatesSuccess 未定义。
  • 您有一个使用 FRUITS 的格式错误的聚合子查询。
  • JOIN 条件缺少过滤值。

不过,我想我明白你想做什么 -- 插入新行,其中的 DIFF 列合并了现有数据中的最新数据。

这看起来像是 LEFT JOIN 历史上最近的记录 table。剩下的就是 COALESCE().

INSERT INTO UpdatesLogTable(TableName, ColumnFilter, FilterName, FilterValue, [Difference], [Date])
    SELECT f.TableName, f.ColumnFilter, f.FilterName, f.FilterValue,
           COALESCE(f.FilterValue - ult.FilterValue, 0), 
           LUP as [Date]
    FROM FRUITS F LEFT JOIN
         (SELECT ult.*,
                 ROW_NUMBER() OVER (PARTITION BY TableName, ColumnFilter ORDER BY LastUpdateDate) as seqnum
          FROM UpdatesLogTable ult 
         ) ult
         ON tr.TableName = ult.TableName AND
            tr.ColumnFilter = ult.ColumnFilter AND
            tr.FilterName = ult.FilterName
            seqnum = 1;