代码之家  ›  专栏  ›  技术社区  ›  Ross

用proc sql转置

  •  0
  • Ross  · 技术社区  · 6 年前

    最简单的例子:

    DATA my_data;
    INPUT id name $;
    DATALINES;
    10 Adam
    20 Bob
    ;
    
    
    DATA my_data2;
    INPUT id name $ value year;
    DATALINES;
    10 Adam 100 2010
    10 Adam 200 2017
    20 Bob  300 2010
    20 Bob  400 2017
    ;
    
    
    PROC SQL;
    CREATE TABLE TEST AS 
    SELECT A.ID, A.NAME,
    CASE WHEN B.YEAR = 2010 THEN B.VALUE ELSE . END,
    CASE WHEN B.YEAR = 2017 THEN B.VALUE ELSE . END
    FROM MY_DATA A 
    LEFT JOIN MY_DATA2 B ON A.ID = B.ID AND A.NAME = B.NAME
    ;
    QUIT;
    

    我得到的输出是:

    10  Adam  100  .
    10  Adam  .    200
    20  Bob   300  .
    20  Bob   .    400
    

    但我想要的是:

    10  Adam 100 200
    20  Bob  300 400
    

    我知道加入是个问题,但我不是100%我的方法应该是什么。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Barbaros Özhan    6 年前

    对ID和名称列以及著名的聚合函数使用分组
    ( 最小 马克斯 )以下内容:

    SELECT A.ID, A.NAME,
    MIN(CASE WHEN B.YEAR = 2010 THEN B.VALUE ELSE NULL END) VALUE1,
    MIN(CASE WHEN B.YEAR = 2017 THEN B.VALUE ELSE NULL END) VALUE2
    FROM MY_DATA A 
    LEFT JOIN MY_DATA2 B ON A.ID = B.ID AND A.NAME = B.NAME
    GROUP BY A.ID, A.NAME
    ORDER BY A.ID 
    
        2
  •  0
  •   Ross    6 年前

    感谢@ezlo。

    PROC SQL;
        CREATE TABLE TEST AS 
            SELECT A.ID, A.NAME,
                MAX(CASE WHEN B.YEAR = 2010 THEN B.VALUE ELSE . END),
                MAX(CASE WHEN B.YEAR = 2017 THEN B.VALUE ELSE . END)
            FROM MY_DATA A 
                LEFT JOIN MY_DATA2 B ON A.ID = B.ID AND A.NAME = B.NAME
            GROUP BY A.ID, A.NAME
    ;
    QUIT;