You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SAS中将车辆注册表按VIN号转置为单行格式?

车辆注册数据转置需求与解决方案

需求说明

我有一个车辆注册数据表,需要将其转置为每个VIN号对应一行的格式,包含该VIN的所有注册信息,最终格式为:vin|company_1|start_date_1|end_date_1|company_2|start_date_2|end_date_2|...|company_n|start_date_n|end_date_n,其中n为最大注册次数。

尝试过的代码(问题)

我尝试使用proc transpose过程步,但得到的start_date和end_date处于不同行,无法满足需求,尝试的代码如下:

proc transpose data = test_vin name=VarName out= outdata;
by vin_number;
var company start_date_date9 end_date_date9;
run;

实现思路与代码

核心思路

  1. 按VIN分组,给每个VIN下的每条注册记录添加递增序号(如seq),用来标记同个VIN下的第几次注册。
  2. 基于序号,将同序号的company、start_date、end_date映射到同一行的对应列,最终实现每个VIN一行的结构。

SAS实现代码

步骤1:给注册记录添加分组序号

data test_vin_seq;
    set test_vin;
    by vin_number;
    if first.vin_number then seq = 1;
    else seq + 1;
run;

步骤2:转置为目标格式

方法一:数据步数组(高效简洁)
/* 先获取所有VIN的最大注册次数 */
proc sql noprint;
    select max(seq) into :max_seq from test_vin_seq;
quit;

/* 循环读取同VIN的所有记录,填充到对应列 */
data transposed_vin;
    do until(last.vin_number);
        set test_vin_seq;
        by vin_number;
        /* 定义数组存储各序号对应的字段 */
        array company[&max_seq] $ company_1 - company_&max_seq;
        array start_date[&max_seq] start_date_1 - start_date_&max_seq;
        array end_date[&max_seq] end_date_1 - end_date_&max_seq;
        /* 按序号赋值 */
        company[seq] = company;
        start_date[seq] = start_date_date9;
        end_date[seq] = end_date_date9;
    end;
    /* 保留需要的字段 */
    keep vin_number company_1 - company_&max_seq start_date_1 - start_date_&max_seq end_date_1 - end_date_&max_seq;
run;
方法二:分变量转置后合并(逻辑清晰)
/* 分别转置company、start_date、end_date */
proc transpose data=test_vin_seq out=trans_company prefix=company_;
    by vin_number;
    id seq;
    var company;
run;

proc transpose data=test_vin_seq out=trans_start prefix=start_date_;
    by vin_number;
    id seq;
    var start_date_date9;
run;

proc transpose data=test_vin_seq out=trans_end prefix=end_date_;
    by vin_number;
    id seq;
    var end_date_date9;
run;

/* 合并三个转置结果 */
data final_vin;
    merge trans_company trans_start trans_end;
    by vin_number;
    drop _name_;
run;

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:22