我对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}一步完成更直截了当。
答案 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>;