如果日期是2015年12月22日并且值为10,那么如何将值10填入qlikview中2015年12月22日之后的所有其他日期?

时间:2015-05-18 09:44:21

标签: qlikview qliksense

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

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

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

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

这意味着2015年12月27日同一项目AB101的价格已下跌。所以该商品的价格在2015年12月22日,2015年12月23日,2015年12月24日... 2015年12月26日期间为95美元。 2015年12月27日,价格为69美元。

[ORDERS TABLE]包含订单日期,ItemCode和2015年12月22日,2015年12月23日,2015年12月24日的数量,依此类推。

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

如果为[PRICE LIST TABLE]中的每个日期指定了该项目的价格,那么我可以加入这两个表格。但[PRICE LIST TABLE]仅包含价格发生变化的记录。所以我不能根据日期合并这两个表。

1 个答案:

答案 0 :(得分:0)

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

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

在下面的示例中,我获取了一些示例数据并创建了一些内联表来表示您的源数据,我还添加了一个新的ItemCode来演示如果您的价格表中有多个内容会发生什么具有重叠的日期范围。请注意,这可能不是应该优化的,并且可能有一个更整洁的方式,但它的工作原理(!)

[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;

这导致下表:

An example of the resulting table