首页 > 解决方案 > 根据给定的输出选择数据

问题描述

表格1:

ID 呼叫人 呼叫状态
1 123 生成
2 321 未生成
3 343 生成
4 567 未生成
5 789 生成

表 2:

用户标识符 ID 呼叫人 生成日期 结果
11 1 123 2021/3/18 1
21 1 123 2021/4/20 1
31 1 123 2021/5/20 0
41 2 321 空值 空值
51 3 343 2021/4/21 1
61 4 567 空值 空值
71 5 789 2021/5/1 0

Oracle 的输出应如下表所示:

ID 呼叫人 生成日期 呼叫状态 结果
1 123 2021/4/20 生成 1
2 321 空值 未生成 空值
3 343 2021/4/21 生成 1
4 567 空值 未生成 空值
5 789 2021/5/1 生成 0

我想要的输出应该如上表所示。对于 CALLID '123',根据表 2,最后生成的调用是在 '2021/5/20' 上,但它的结果是我不想选择的 '0'。它应该选择“2021/4/21”,因为它的结果是“1”。但是对于 CALLID '789',No RESULT 是 '1',所以它应该选择 Generated Date 作为 '2021/5/1'。

标签: sqloraclegroup-by

解决方案


NVL()您可以根据列的值使用条件聚合和函数,result例如

SELECT t1.id, MAX(t1.callid) AS callid, 
       NVL(MAX(CASE WHEN result = 1 THEN t2.generatedate END),
           MAX(CASE WHEN NVL(result,0)!=1 THEN t2.generatedate END)) AS generateddate, 
       MAX(t1.callstatus) AS callstatus, MAX(result) AS result
  FROM Table1 t1
  JOIN Table2 t2
    ON t2.id = t1.id         
   AND t2.callid = t1.callid       
 GROUP BY t1.id
 ORDER BY t1.id
ID 呼叫人 生成日期 呼叫状态 结果
1 123 20/04/2021 生成 1
2 321 未生成
3 343 21/04/2021 生成 1
4 567 未生成
5 789 2021 年 1 月 5 日 生成 0

Demo


推荐阅读