如果日期是 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]
包含字段:OrderDate
、ItemCode
、Quantity
。
[PRICE LIST TABLE]
包含字段:Date
、ItemCode
、Price
.
现在 [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]
仅包含价格发生变化的记录。所以我不能根据日期合并两个表。
在这种情况下,您可以使用一种或两种方法:填充稀疏字段(即 Date
和 ItemCode
)或使用 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:
我有两个表 [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 |
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]
仅包含价格发生变化的记录。所以我不能根据日期合并两个表。
在这种情况下,您可以使用一种或两种方法:填充稀疏字段(即 Date
和 ItemCode
)或使用 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: