Qlik脚本Do While循环加载多QVD文件异常问题求助
QlikView循环加载QVD脚本修复方案
核心问题分析
你的脚本存在三个关键错误:循环内删除TMP表导致数据无法累积、每次循环新建独立TMP表、最大月份计算逻辑错位,最终导致生成多个孤立表且仅保留首个文件数据。
修复建议
- 移除循环内的表删除语句:删除
Drop Table TMP;,确保每次循环的结果能累积到TMP表中。 - 调整TMP表的初始化逻辑:仅在第一次循环前用
NoConcatenate创建空表,后续循环使用Concatenate将新数据追加到已有TMP表。 - 将MaxYearMM计算移到循环外:等所有月份数据加载完成后,统一计算每个Field1对应的最大YearMM,避免单月数据误标记。
- 调整关联操作时机:将与file2.qvd的左连接移到循环结束后,避免重复关联带来的性能损耗和数据错误。
修正后的完整脚本
LET Start = AddMonths(MakeDate(Year(Today()), 1, 1), 0); LET End = AddMonths(MakeDate(Year(Today()), 12, 31), 0); // 初始化空表,用于累积所有月份数据 NoConcatenate TMP: LOAD Null() as Field1, Null() as Field2, Null() as Field3 AutoGenerate(0); Do While Start <= End LET YearMM = Year(Date('$(Start)','YYYY-MM-DD')) * 100 + Month(Date('$(Start)','YYYY-MM-DD')); // 追加当月QVD数据到TMP表 Concatenate(TMP) LOAD Field1, Field2, Field3 FROM [path/File_$(YearMM).qvd] (qvd); LET Start = Date(AddMonths('$(Start)', 1), 'YYYY-MM-DD'); Loop // 与file2.qvd做左连接 Left Join(TMP) LOAD Field1, Field2 FROM [Path/file2.qvd] (qvd); // 计算每个Field1的最大YearMM并标记 Left Join(TMP) LOAD DISTINCT Field1, Max(YearMM) as MaxYearMM Resident TMP Group By Field1; // 生成最终结果表 NoConcatenate EndTable: LOAD * Resident TMP Where MaxYearMM = (SELECT Max(YearMM) FROM TMP); // 筛选全局最大月份的数据 // 保存结果并清理临时表 Store EndTable into [Path/endfile.qvd] (qvd); Drop Tables TMP, EndTable;
额外说明
- 初始化空表是为了确保第一次
Concatenate能正确执行,避免因第一个文件加载失败导致表不存在的问题。 - 最终筛选
MaxYearMM的逻辑可根据需求调整,比如固定取当年最后一个月,或取所有数据中的最大月份。
内容的提问来源于stack exchange,提问作者JaniH
相关产品推荐
相关产品推荐

