ВЫБЕРИТЕ один и тот же столбец КАК разные столбцы в зависимости от условия - PullRequest
0 голосов
/ 27 апреля 2018

Я не очень хорошо разбираюсь в SQL, и я нашел обходной путь, чтобы сделать то, что я ищу, но я уверен, что есть более элегантный способ.

У меня есть набор данных SAS (к которому я обращаюсь с помощью SQL-запросов) со столбцом month, значения которого выглядят как YYYYMM с записями в 2016 и 2017 годах для конкретного memberid, поэтому memberid XYZ может содержать до 24 строк с 201601 по 201712. Существует также столбец score, который может изменяться или не изменяться для разных годов, но никогда не меняется для разных месяцев в одном и том же году.

Пример:

memberid    month    score
XYZ         201601   1.0
XYZ         201602   1.0
XYZ         201703   1.5

Итак, я хотел бы запрос, который выглядит следующим образом:

SELECT <other table columns>,
       CASE WHEN el.month LIKE '2016%' THEN el.score AS score2016
            ELSE WHEN el.month LIKE '2017%' THEN el.score AS score2017 END
FROM <other table>
INNER JOIN elig AS el
ON <other table>.memberid = el.memberid

Вышеприведенный запрос (CASE оператор, очевидно, синтаксически бесполезен, но в результирующей таблице после объединения должна быть только одна запись на члена и два новых столбца, один для score2016 и один для score2017:

memberid    [...columns...]    score2016    score2017
XYZ               ...          1.0          1.5 

Сейчас я решаю эту проблему, создавая отдельные таблицы для записей 2016 и 2017 для elig, за которыми следуют два соединения, но мне было интересно, можно ли сделать это за один шаг с помощью CASE более просто.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать агрегацию:

SELECT <other table columns>,
       MAX(CASE WHEN el.month LIKE '2016%' THEN el.score END) AS score2016,
       MAX(CASE WHEN el.month LIKE '2017%' THEN el.score END) AS score2017 
FROM <other table> INNER JOIN 
     elig el
     ON <other table>.memberid = el.memberid
GROUP BY <other table columns>;
...