0

我有两张桌子[ORDERS TABLE][PRICE LIST TABLE].

[ORDERS TABLE]包含以下字段:OrderDate, ItemCode, Quantity. [PRICE LIST TABLE]包含以下字段:Date, ItemCode, Price.

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

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

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

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

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

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

4

1 回答 1

0

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

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

在下面的示例中,我获取了您的一些示例数据并创建了一些内联表来表示您的源数据,我还添加了一个新表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;

结果如下表:

结果表的示例

于 2015-05-19T09:13:41.977 回答