SAS中的MERGE BY - 与sashelp.class的不良结果

时间:2018-01-21 13:19:38

标签: merge sas dataset

我想在SAS中合并两个数据库。我有一个任务使用MERGE语句,虽然我更喜欢使用SQL。不过这是我使用的代码:

DATA grades;
    INPUT Name $ grades;
    DATALINES;
    Alice 5
    Carol 1
    John 5
    Robert 5
    Thomas 3
    Judy 6
    ;
    PROC SORT DATA=grades;
    BY Name;
RUN;

PROC PRINT DATA=SASHELP.class;
PROC PRINT DATA=grades;

DATA merged;
    MERGE SASHELP.class grades;
    BY Name;
RUN;

PROC PRINT DATA=merged;

我获得的最终结果是:

    Obs Name    Sex Age Height  Weight  grades
    1   Alice       .   .       .       5
    2   Carol       .   .       .       1
    3   John        .   .       .       5
    4   Judy        .   .       .       6
    5   Robert      .   .       .       5
    6   Thomas      .   .       .       3
    7   Alfred  M   14  69.0    112.5   .
    8   Alice   F   13  56.5    84.0    .
    9   Barbara F   13  65.3    98.0    .
    10  Carol   F   14  62.8    102.5   .
    11  Henry   M   14  63.5    102.5   .
    12  James   M   12  57.3    83.0    .
    13  Jane    F   12  59.8    84.5    .
    14  Janet   F   15  62.5    112.5   .
    15  Jeffrey M   13  62.5    84.0    .
    16  John    M   12  59.0    99.5    .
    17  Joyce   F   11  51.3    50.5    .
    18  Judy    F   14  64.3    90.0    .
    19  Louise  F   12  56.3    77.0    .
    20  Mary    F   15  66.5    112.0   .
    21  Philip  M   16  72.0    150.0   .
    22  Robert  M   12  64.8    128.0   .
    23  Ronald  M   15  67.0    133.0   .
    24  Thomas  M   11  57.5    85.0    .
    25  William M   15  66.5    112.0   .

如果我通过删除Merge语句中的“BY Name”来修改代码,那么结果并不是更好:

Obs Name    Sex Age Height  Weight  grades
1   Alice   M   14  69.0    112.5   5
2   Carol   F   13  56.5    84.0    1
3   John    F   13  65.3    98.0    5
4   Judy    F   14  62.8    102.5   6
5   Robert  M   14  63.5    102.5   5
6   Thomas  M   12  57.3    83.0    3
7   Jane    F   12  59.8    84.5    .
8   Janet   F   15  62.5    112.5   .
9   Jeffrey M   13  62.5    84.0    .
10  John    M   12  59.0    99.5    .
11  Joyce   F   11  51.3    50.5    .
12  Judy    F   14  64.3    90.0    .
13  Louise  F   12  56.3    77.0    .
14  Mary    F   15  66.5    112.0   .
15  Philip  M   16  72.0    150.0   .
16  Robert  M   12  64.8    128.0   .
17  Ronald  M   15  67.0    133.0   .
18  Thomas  M   11  57.5    85.0    .
19  William M   15  66.5    112.0   .

看起来要工作,直到你查看Robert的数据为例。结果应该是:

Name    Sex Age Height  Weight Grade
Robert  M   12  64.8    128.0  5

Name    Sex Age Height  Weight Grade
Robert  M   14  63.5    102.5   5

看来阿尔弗雷德被覆盖了。为什么数据不一致?我做错了什么?

1 个答案:

答案 0 :(得分:3)

这似乎是一个数据问题,其中成绩表中的名称具有一个或多个前导空格。 HTML和PDF的默认输出样式不会使前导空格可见。 rect.setOnMouseClicked(new EventHandler<MouseEvent>(){ @Override public void handle(MouseEvent me){ Main.editGrid ((int) rect.getX()/gridSize, (int) rect.getY()/gridSize, true); } }); 并查看ODS LISTING窗口中的输出应显示前导空格。

你可以修复&#39; OUTPUT步骤中name = left(name);的问题。您可以使用grades强制解决问题。使用&#39; $ HEX&#39;检查基础字符数据格式。

name = ' ' || left(name);

没有PROC REPORT data=grades; columns name grades name=namehex; define namehex / format=$hex20.; run; 的合并是一种特殊的边缘情况;通常当您知道表A中的先验未键控数据与表B中的数据按行1:1相关时。