如何解决QlikSense的串联和连接是水平合并表而不是垂直合并表 问题解决方案
我有以下2张桌子:
[GP_BMI]:
LOAD
gp_event_id as all_events_event_bmi,gp_dataElement as gp_height_bmi_de,gp_de_value as gp_height_bmi_value,'GP' as gp_height_bmi_stage
Resident GP
WHERE gp_dataElement='vOIPn23yOcr'
AND gp_status='COMPLETED';
LEFT JOIN (GP_BMI)
LOAD
gp_event_id as all_events_event_bmi,gp_dataElement as gp_weight_bmi_de,gp_de_value as gp_weight_bmi_value
Resident GP
WHERE gp_dataElement='xNkRaZUG7fI'
AND gp_status='COMPLETED';
我之所以加入这里,是因为我需要同时具有ID为vOIPn23yOcr
和xNkRaZUG7fI
的身高和体重字段在表中水平显示,因为它们是从数据库源以垂直方式出现的
第二张表如下:
[NUTRITION_BMI]:
LOAD
nutrition_event_id as nutrition_all_events_event_bmi,nutrition_dataElement as nutrition_height_bmi_de,nutrition_de_value as nutrition_height_bmi_value,'Nutrition' as nutrition_height_bmi_stage
Resident Nutrition
WHERE nutrition_dataElement='vOIPn23yOcr'
AND nutrition_status='COMPLETED';
LEFT JOIN (NUTRITION_BMI)
LOAD
nutrition_event_id as nutrition_all_events_event_bmi,nutrition_dataElement as nutrition_weight_bmi_de,nutrition_de_value as nutrition_weight_bmi_value
Resident Nutrition
WHERE nutrition_dataElement='xNkRaZUG7fI'
AND nutrition_status='COMPLETED';
现在,在这种情况下,我想联接这些表vertically
以便在Qlik Sense
表中显示它:
LOAD * Resident [PEDIATRIC_BMI];
JOIN(GP_BMI)
LOAD * Resident [NUTRITION_BMI];
但是结果是水平显示。
我尝试过:
LOAD * Resident [PEDIATRIC_BMI];
Concatenate(GP_BMI)
LOAD * Resident [NUTRITION_BMI];
并得到同一表,其中所有字段均水平显示。但是我在组合表时需要垂直,因为每个表都代表一个阶段。
解决方法
问题
Qlik中的表操作基于字段名称(您可以将其视为列名称)。
当您执行 JOIN 操作时,系统会查找两个表之间共有的字段/列名,并尝试根据这些表中的共享值来合并表中的行字段。
如果它是 OUTER JOIN (即您在此处使用的默认联接),则这可能会创建新行,但是它的目的是按照您所说的水平连接表。
正确执行操作的目的是-将行彼此叠置- CONCATENATE 。
CONCATENATE 操作将新行(垂直)添加到某些现有表上。为此,它将查看新行中的字段/列名称。对于与现有表中的字段/列名称匹配的任何内容,该值将放在该列中。否则,将自动创建一个新列来保存该值。
从上面的内容来看,我认为其意图是[NUTRITION_BMI]表中的每一列都应位于[GP_BMI]表中具有相似名称的列下方,即:
-
在 all_events_event_bmi 下的
- nutrition_all_events_event_bmi gp_height_bmi_de 下的
- nutrition_height_bmi_de
以此类推。问题在于,由于这些字段具有不同的名称,因此Qlik会为每个字段创建一个新的列。
解决方案
为了将表串联在一起,您需要字段名称相同。为了区分行的不同“类型”,您需要一个字段来指示“类型”。看来您已经使用 gp_height_bmi_stage 字段进行了此操作。
您可以执行几个不同的命令,其中一个看起来像这样(请注意,如果不同的命令之间的“ all_events_event_bmi”字段存在任何重叠,请在联接中包含“ stage”字段阶段):
[BMI]:
LOAD
gp_event_id as all_events_event_bmi,gp_dataElement as height_bmi_de,gp_de_value as height_bmi_value,'GP' as stage
Resident GP
WHERE gp_dataElement='vOIPn23yOcr'
AND gp_status='COMPLETED';
CONCATENATE
LOAD
nutrition_event_id as all_events_event_bmi,nutrition_dataElement as height_bmi_de,nutrition_de_value as height_bmi_value,'Nutrition' as stage
Resident Nutrition
WHERE nutrition_dataElement='vOIPn23yOcr'
AND nutrition_status='COMPLETED';
[TMP_BMI_WEIGHTS]:
LOAD
gp_event_id as all_events_event_bmi,gp_dataElement as weight_bmi_de,gp_de_value as weight_bmi_value,'GP' as stage
Resident GP
WHERE gp_dataElement='xNkRaZUG7fI'
AND gp_status='COMPLETED';
CONCATENATE
LOAD
nutrition_event_id as all_events_event_bmi,nutrition_dataElement as weight_bmi_de,nutrition_de_value as weight_bmi_value,'Nutrition' as stage
Resident Nutrition
WHERE nutrition_dataElement='xNkRaZUG7fI'
AND nutrition_status='COMPLETED';
LEFT JOIN(BMI)
LOAD * RESIDENT TMP_BMI_WEIGHTS;
DROP TABLE TMP_BMI_WEIGHTS;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。