Sql 根据条件选择相同列作为不同列
我对SQL不是很精通,我已经找到了一种解决方法来完成我正在寻找的任务,但我相信有一种更优雅的方法 我有一个SAS数据集(我正在使用SQL查询访问该数据集),它有一个Sql 根据条件选择相同列作为不同列,sql,join,case,Sql,Join,Case,我对SQL不是很精通,我已经找到了一种解决方法来完成我正在寻找的任务,但我相信有一种更优雅的方法 我有一个SAS数据集(我正在使用SQL查询访问该数据集),它有一个month列,其值看起来像YYYYMM,其中包含2016年和2017年特定memberid的条目,因此memberidXYZ在201601到201712期间最多可以有24行。还有一个score列,它在不同的年份可能会改变,也可能不会改变,但在同一年的不同月份它不会改变 例如: memberid month score XY
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
现在我正在解决这个问题,为2016年和2017年的
elig
条目创建单独的表,然后创建两个联接,但我想知道是否可以更直接地使用CASE
一步完成。您可以使用聚合:
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>;
SELECT,
最大值(当el.month如“2016%”时,则el.score结束)作为score2016,
最大值(当el.month如“2017%”时,则el.score结束)作为score2017
从内部连接
艾利格
ON.memberid=el.memberid
分组;
您可以始终使用枢轴。编辑:或者戈登说的。
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>;