Транспонировать с PROC SQL - PullRequest
0 голосов
/ 27 июня 2018

Минимальный пример:

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 ]

0 голосов
/ 27 июня 2018

Благодаря @ 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;
0 голосов
/ 27 июня 2018

Использование GROUPING для столбцов ID и NAME и известных агрегатных функций
( MIN или MAX ):

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 
...