如果日期是 22/12/2015 并且值为 10,如何在 qlikview 中将值 10 填充到 22/12/2015 之后的所有其他日期?

If a date is 22/12/2015 and has a value of 10, how to fill the value 10 to all the other dates following 22/12/2015 in qlikview?

我有两个表 [ORDERS TABLE][PRICE LIST TABLE]

[ORDERS TABLE] 包含字段:OrderDateItemCodeQuantity[PRICE LIST TABLE] 包含字段:DateItemCodePrice.

现在 [PRICE LIST TABLE] 解释了某些商品在特定日期的价格。它几乎不包含 10 - 15 条记录。例如:

Date       | ItemCode | Price
-----------+----------+----------
22/12/2015 | AB101    |    
27/12/2015 | AB101    |    

这意味着同一商品 AB101 在 2015 年 12 月 27 日降价了。因此,在 22/12/2015、23/12/2015、24/12/2015 ... 26/12/2015 期间,该商品的价格为 95 美元。 2015 年 12 月 27 日,价格为 69 美元。

[ORDERS TABLE] 有订单日期,ItemCode 和数量为 22/12/2015、23/12/2015、24/12/2015 等等。

问题: 我想将字段 Price[PRICE LIST TABLE] 添加到 [ORDERS TABLE]。但要这样做,QlikView 必须在 22/12/2015 和 26/12/2015 之间为项目分配 95 美元的价格。现在,2015 年 12 月 27 日,与上述相同的商品的价格发生了 69 美元的变化。因此,在指定另一次价格变动之前,2015 年 12 月 27 日及之后的商品价格必须为 69 美元。我该怎么做?

如果在 [PRICE LIST TABLE] 中的每个日期都为商品指定了价格,那么我可以只连接这两个表。但是 [PRICE LIST TABLE] 仅包含价格发生变化的记录。所以我不能根据日期合并两个表。

在这种情况下,您可以使用一种或两种方法:填充稀疏字段(即 DateItemCode)或使用 IntervalMatch.

这是一些用于填充字段的脚本。通常,如果您只想填充一个字段(即 Date),这很简单,但是,由于您的 [PRICE LIST TABLE] 中可能有多个 ItemCode,那么我们必须评估 table 中每个唯一 ItemCode 的日期范围 - 最简单的方法是通过一个循环检查每个范围并相应地填充。

在下面的示例中,我使用了一些示例数据并创建了一些内联 table 来表示您的源数据,我还添加了一个新的 ItemCode 来演示如果您有在您的价格 table 中有多个具有重叠的日期范围。请注意,这可能没有达到应有的优化程度,并且可能有更简洁的方法,但它有效(!)

[PRICE LIST TABLE]:
LOAD 
    * 
INLINE [
    PricingDate, ItemCode, Price
    22/12/2015, AB101, 95
    27/12/2015, AB101, 69
    23/12/2015, AB102, 23
    29/12/2015, AB102, 43
];

TempTable_Pricing: 
NOCONCATENATE
LOAD
    PricingDate, 
    ItemCode,
    Price
RESIDENT [PRICE LIST TABLE];

DROP TABLE [PRICE LIST TABLE];

ItemList:
NOCONCATENATE
LOAD DISTINCT
    ItemCode
RESIDENT TempTable_Pricing;

FOR i = 0 to NoOfRows('ItemList') - 1

    LET item = peek('ItemCode',i,'ItemList');

    MinMaxDate:
    LOAD
        Min(PricingDate) as MinDate, 
        Max(PricingDate) as MaxDate
    RESIDENT TempTable_Pricing
    WHERE ItemCode = '$(item)';

    Let vMinDate = Peek('MinDate',-1,'MinMaxDate') - 1;
    Let vMaxDate = Peek('MaxDate',-1,'MinMaxDate')    ;

    JOIN (TempTable_Pricing)
    LOAD
        Date(recno()+$(vMinDate)) as PricingDate,
        '$(item)' as ItemCode
    AUTOGENERATE vMaxDate - vMinDate;

    PricingTable_Temp_$(i):
    NOCONCATENATE LOAD
        PricingDate as PricingDate_Temp, 
        if(isnull(ItemCode), peek(ItemCode), ItemCode) as ItemCode,
        if(isnull(Price), peek(Price), Price) as Price
    RESIDENT TempTable_Pricing
    ORDER BY ItemCode, PricingDate;

    DROP TABLE MinMaxDate;

    PricingTable:
    LOAD
        PricingDate_Temp as Date,
        ItemCode,
        Price
    RESIDENT PricingTable_Temp_$(i);

    DROP TABLE PricingTable_Temp_$(i);      

NEXT

DROP TABLE ItemList;
DROP TABLE TempTable_Pricing;

[ORDERS TABLE]:
NOCONCATENATE
LOAD
    date(OrderDate) as Date,
    ItemCode,
    Quantity
INLINE [
    OrderDate, ItemCode, Quantity
    22/12/2015, AB101, 1
    24/12/2015, AB101, 2
    27/12/2015, AB101, 4
    26/12/2015, AB102, 3
    29/12/2015, AB102, 1
];

INNER JOIN ([ORDERS TABLE])
LOAD
    Date,
    ItemCode,
    Price
RESIDENT PricingTable;

DROP TABLE PricingTable;

结果如下 table: