Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据条件选择相同列作为不同列_Sql_Join_Case - Fatal编程技术网

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

我对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

现在我正在解决这个问题,为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>;