sql - 根据给定的输出选择数据
问题描述
表格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'。
解决方案
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 |
推荐阅读
- laravel - 注册后将新用户重定向到某个页面,同时向他们发送一些电子邮件
- php - Wordpress:页面分页?
- c# - 如何在 WinForms 上通过 CefShap 捕获 js 按钮 onclick 事件?
- spring - Spring将组件作为方法中的参数传递
- python - 在没有追溯过滤的情况下创建对每个元素有限制的组合
- python - 如果 celery 代理没有运行,Django 测试会随机冻结
- laravel - 当我想在我的 laravel 6.12 中安装 yajraBox 时,我遇到了以下错误。我该如何解决这个问题?
- php - 简化 MySQL 更新脚本中的许多 PHP 变量
- angular - Angular 8:通过本地服务在独立模块中的组件之间传递数据
- python - Spark Dataframe:在窗口分区后将数据帧写入CSV时丢失文件