根据条件选择相同的列AS不同的列

时间:2018-04-27 20:15:20

标签: sql join case

我对SQL并不是很精通,我找到了一个解决方法来做我想要的,但我确信有一种更优雅的方式。

我有一个SAS数据集(我使用SQL查询访问),其中month列的值类似YYYYMM,2016年和2017年的条目为memberid所以memberid XYZ最多可以包含201601到201712的24行。还有一个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,一列用于{{ 1}}:

score2017

现在我正在通过为2016年和2017年的memberid [...columns...] score2016 score2017 XYZ ... 1.0 1.5 条目创建单独的表来解决此问题,然后是两个JOIN,但我想知道是否可以使用{{1}一步完成更直截了当。

1 个答案:

答案 0 :(得分:2)

您可以使用聚合:

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