我有两张表[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
这意味着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]
仅包含价格发生变化的记录。所以我不能根据日期合并这两个表。
答案 0 :(得分:0)
在这种情况下,您可以使用一种或两种方法:填充稀疏填充的字段(即Date
和ItemCode
)或使用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;
这导致下表: