能否用ECL语言转置数据集?两类转置场景求示例代码
问题一:数据集转置(行指标转列指标)
需求说明
输入数据集以指标为行,列对应不同日期的数值;需转置为日期为行,列对应不同指标的数值结构。
ECL实现代码
// 定义输入记录结构(匹配示例输入的字段逻辑) InputRec := RECORD STRING Metric; INTEGER '202301'; INTEGER '202302'; INTEGER '202303'; END; // 模拟示例输入数据集 InputData := DATASET([ {'MetricA', 10, 20, 30}, {'MetricB', 40, 50, 60}, {'MetricC', 70, 80, 90} ], InputRec); // 第一步:将日期列拆分为日期-值对(UNPIVOT) Unpivoted := UNPIVOT(InputData, Date := COLUMNNAME, Value := COLUMNVALUE, '202301', '202302', '202303'); // 第二步:将指标转置为列(PIVOT) Transposed := PIVOT(Unpivoted, Date, Metric AS ColumnName, Value AS ColumnValue, {'MetricA', 'MetricB', 'MetricC'}); // 输出转置结果 OUTPUT(Transposed, NAMED('Transposed_Result'));
问题二:转置后数据集转换为长格式
需求说明
输入为问题一的转置结果(日期为行,指标为列),需转换为每行包含日期、指标名称、对应数值的长格式结构。
ECL实现代码
基础硬编码版本
// 定义转置后的输入记录结构 TransposedRec := RECORD STRING Date; INTEGER MetricA; INTEGER MetricB; INTEGER MetricC; END; // 模拟问题一的输出数据集 TransposedData := DATASET([ {'202301', 10, 40, 70}, {'202302', 20, 50, 80}, {'202303', 30, 60, 90} ], TransposedRec); // 转换为长格式(UNPIVOT) LongFormat := UNPIVOT(TransposedData, Metric := COLUMNNAME, Value := COLUMNVALUE, MetricA, MetricB, MetricC); // 输出结果 OUTPUT(LongFormat, NAMED('Long_Format_Result'));
动态读取字段名版本(无需硬编码)
利用ECL元数据函数DATASETMETADATA动态获取字段列表,避免硬编码指标列:
// 获取转置后数据集的指标字段列表(排除第一个Date字段) MetricFields := DATASETMETADATA(TransposedData).Columns[2..]; // 动态生成转换逻辑 DynamicLongFormat := UNPIVOT(TransposedData, Metric := COLUMNNAME, Value := COLUMNVALUE, MetricFields); OUTPUT(DynamicLongFormat, NAMED('Dynamic_Long_Format'));
内容的提问来源于stack exchange,提问作者S DHANUSH
相关产品推荐
相关产品推荐

