gpt4 book ai didi

sql - 如何根据不同的条件从同一个表的不同行中检索数据

转载 作者:搜寻专家 更新时间:2023-10-30 20:30:44 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的 SQL 语句来构建 Oracle 报告,但我遇到了困难。 x_request 表存储发出的请求,与已完成的特定请求相关的不同任务存储在 x_request_work_log 中。总结一下这些表的结构:

X_request

-id  
-name
-requester
-request_date

x_request_work_log

-id
-request_id (foreign key)
-taskId
-start_date
-end_date

现在让我们假设这些表中填充了如下示例数据:

x_请求

id    name      requester    request_date
1 firstReq John 01/01/2012
2 secondReq Steve 21/01/2012

x_request_work_log

id    requestId    taskId    startDate     endDate
1 1 0 01/01/2012 03/01/2012
2 1 1 04/01/2012 04/01/2012
3 1 2 05/01/2012 15/01/2012
4 2 0 24/01/2012 02/02/2012

我的报告模板如下:

requestName    timeSpent(task(0))    timeSpent(task(1))     timeSpent(task(2)) 
| | | | | | | |

所以,这就是我被困的地方。我需要一个 Sql Select 语句,它将以如上所述的格式化方式返回每一行。我如何检索和显示不同任务的开始和结束日期。顺便说一下 timeSpent = endDate(task(x)) - startDate(task(x))

注意:由于性能限制,不能为每个花费时间计算使用不同的选择子查询。必须有另一种方法。

最佳答案

听起来你只是想要类似的东西

SELECT r.name request_name,
SUM( (CASE WHEN l.taskId = 0
THEN l.endDate - l.StartDate
ELSE 0
END) ) task0_time_spent,
SUM( (CASE WHEN l.taskId = 1
THEN l.endDate - l.StartDate
ELSE 0
END) ) task1_time_spent,
SUM( (CASE WHEN l.taskId = 2
THEN l.endDate - l.StartDate
ELSE 0
END) ) task2_time_spent
FROM x_request_work_log l
JOIN x_request r ON (l.requestId = r.Id)
GROUP BY r.name

如果您碰巧使用的是 11g,您还可以使用 PIVOT 运算符。

关于sql - 如何根据不同的条件从同一个表的不同行中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com