Я не очень хорошо разбираюсь в 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
более просто.