Qlikview - 连接表和更新值

时间:2014-07-23 11:13:32

标签: qlikview

我有QV报告,表格如下:

+---------+--------+---------------+------+-------+
|  HOST   | OBJECT | SPECIFICATION | COPY | LAST  |
+---------+--------+---------------+------+-------+
| host001 | obj01  | spec01        | c1   | 15:55 |
| host002 | obj02  | spec02        | c2   | 14:30 |
| host003 | -      | -             | -    | -     |
| host004 | -      | -             | -    | -     |
+---------+--------+---------------+------+-------+

现在我又拿了一张小桌子:

spec1
host1
host4

我需要的是加载脚本以这种方式连接这些表:

第一行是规范,所有其他行是主机。如果主机的名称来自第二个表(host1)的第二行并且第一行的规范,那么我需要将主机行(host1)中的所有其他值复制到第二个表(host4)中的其他主机的行,例如:

+---------+--------+---------------+------+-------+
|  HOST   | OBJECT | SPECIFICATION | COPY | LAST  |
+---------+--------+---------------+------+-------+
| host001 | obj01  | spec01        | c1   | 15:55 |
| host002 | obj02  | spec02        | c2   | 14:30 |
| host003 | -      | -             | -    | -     |
| host004 | obj01  | spec01        | c1   | 15:55 |
+---------+--------+---------------+------+-------+

我有几个表,如第二个,我需要连接所有这些表。当然,在firts表中可以有多个具有相同主机,相同规格等的行。 " - " sign是null()值,可以更改第二个表格布局。

我尝试了所有JOINS,现在我试图迭代整个表并进行比较,但我是QV的新手,我错过了一些像UPDATE这样的SQL功能。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是一个脚本,它并不完美,可能有一个更简洁的解决方案(!),但它适用于您的场景。

我重新安排了您的“复制表”,以便它有三列:

HOST      SPECIFICATION   TARGET_HOST

然后,您可以为要复制的其他主机重复行,如下所示:

HOST      SPECIFICATION   TARGET_HOST
host001   spec01          host004
host001   spec01          host003

脚本(我包含了一些虚拟数据,所以你可以尝试一下):

Source_Data:
LOAD * INLINE [
    HOST, OBJECT, SPECIFICATION, COPY, LAST
    host001, obj01, spec01  , c1, 15:55
    host002, obj02, spec02  , c2, 14:30
    host003
    host004
];

Copy_Table:
LOAD * INLINE [
    HOST, SPECIFICATION, TARGET_HOST
    host001, spec01, host004
];


Link_Table:
NOCONCATENATE
LOAD
    HOST & SPECIFICATION as %key,
    TARGET_HOST
RESIDENT Copy_Table;

DROP TABLE Copy_Table;

LEFT JOIN (Link_Table)
LOAD
    HOST & SPECIFICATION as %key,
    HOST, OBJECT, SPECIFICATION, COPY, LAST
    ;
LOAD
    *
RESIDENT Source_Data;


Complete_Data:
NOCONCATENATE LOAD
    TARGET_HOST as HOST,
    OBJECT, SPECIFICATION, COPY, LAST
RESIDENT Link_Table;

CONCATENATE (Complete_Data)
LOAD
    *
RESIDENT Source_Data 
WHERE NOT Exists(TARGET_HOST,HOST & SPECIFICATION);  // old condition: WHERE NOT Exists(TARGET_HOST,HOST);

DROP TABLES Source_Data, Link_Table;