Как свернуть повторяющиеся строки из-за пораженных результатов в SAS - PullRequest
0 голосов
/ 18 января 2020

У меня есть набор данных, который выглядит примерно так (таблица 2):

CUSTOMER   LEGACY_ID  LEGACY_ID_DESC
00001      T121212    COLL_NUM
00001      23232      OTHER_NUM
00001      C22222     ORIG_NUM
00001      45454      OTHER_NUM
00002      U64646     COLL_NUM
00002      C44444     ORIG_NUM

Я пытаюсь присоединить эту таблицу к другой таблице, выполнив следующие действия:

CREATE TABLE &SYSUSERID..&SYSUSERID._NEW_TABLE as
SELECT DISTINCT CASE WHEN L.LEGACY_ID_DESC = 'COLL_NUM' THEN L.LEGACY_ID ELSE '.' END AS COLL_NUM,
       CASE WHEN L.LEGACY_ID_DESC ='OTHER_NUM' THEN L.LEGACY_ID ELSE '.' END AS OTHER_NUM,
       CASE WHEN L.LEGACY_ID_DESC = 'ORIG_NUM' THEN L.LEGACY_ID ELSE '.' END AS ORIG_NUM,
       T.CUSTOMER,
       CASE WHEN L.LEGACY_ID_DESC = 'TRMNTN_NUM' THEN L.LEGACY_ID ELSE '.' END AS TRMNTN_NUM,
       T.FIRST_NAME, 
       T.LAST_NAME,
       T.CITY,
       T.STATE
FROM &SYSUSERID..&SYSUSERID._TABLE1 T LEFT JOIN
     &SYSUSERID..&SYSUSERID._TABLE2 L
            ON T.CUSTOMER=L.CUSTOMER;

Вот результат, который я получаю:

COLL_NUM   OTHER_NUM   ORIG_NUM   CUSTOMER   TRMNTN_NUM   FIRST_NAME   LAST_NAME   CITY   STATE
t121212    .           .          00001      .            TOM          PETTY       ANY    AL
.          23232       .          00001      .            TOM          PETTY       ANY    AL
.          45454       .          00001      .            TOM          PETTY       ANY    AL
.          .           C22222     00001      .            TOM          PETTY       ANY    AL
.          .           .          00001      .            TOM          PETTY       ANY    AL
U64646     .           .          00002      .            BETTY        WHITE       POM    CT
.          .           C44444     00002      .            BETTY        WHITE       POM    CT
.          .           .          00002      .            BETTY        WHITE       POM    CT
U64646     .           .          00002      .            BETTY        WHITE       FORK   MA
.          .           C44444     00002      .            BETTY        WHITE       FORK   MA
.          .           .          00002      .            BETTY        WHITE       FORK   MA

Вот результат, который я хочу:

COLL_NUM   OTHER_NUM   ORIG_NUM   CUSTOMER   TRMNTN_NUM   FIRST_NAME   LAST_NAME   CITY   STATE
t121212    23232       C22222     00001      .            TOM          PETTY       ANY    AL
t121212    45454       C22222     00001      .            TOM          PETTY       ANY    AL
U64646     .           C44444     00002      .            BETTY        WHITE       POM    CT
U64646     .           C44444     00002      .            BETTY        WHITE       FORK   MA

Я рисую пробел о том, как выполнить sh это!

1 Ответ

1 голос
/ 18 января 2020

Вы хотите использовать GROUP BY вместо DISTINCT. Каждое и каждое выражение CASE должно быть помещено в статистическую функцию (обычно MAX()), а другие столбцы go предложение GROUP BY.

Агрегирование гарантирует, что для каждой будет сгенерирована только одна запись. кортеж значений столбцов в предложении GROUP BY, в то время как агрегатные функции игнорируют значения NULL. Эта техника называется условная агрегация .

CREATE TABLE &SYSUSERID..&SYSUSERID._NEW_TABLE as
SELECT 
    MAX(CASE WHEN L.LEGACY_ID_DESC = 'COLL_NUM' THEN L.LEGACY_ID ELSE '.' END) AS COLL_NUM,
    MAX(CASE WHEN L.LEGACY_ID_DESC ='OTHER_NUM' THEN L.LEGACY_ID ELSE '.' END) AS OTHER_NUM,
    MAX(CASE WHEN L.LEGACY_ID_DESC = 'ORIG_NUM' THEN L.LEGACY_ID ELSE '.' END) AS ORIG_NUM,
    T.CUSTOMER,
    MAX(CASE WHEN L.LEGACY_ID_DESC = 'TRMNTN_NUM' THEN L.LEGACY_ID ELSE '.' END) AS TRMNTN_NUM,
    T.FIRST_NAME, 
    T.LAST_NAME,
    T.CITY,
    T.STATE
FROM &SYSUSERID..&SYSUSERID._TABLE1 T 
LEFT JOIN &SYSUSERID..&SYSUSERID._TABLE2 L ON T.CUSTOMER=L.CUSTOMER
GROUP BY 
    T.CUSTOMER,    
    T.FIRST_NAME, 
    T.LAST_NAME,
    T.CITY,
    T.STATE
...