我正在尝试编写一个用于构建Oracle报告的简单SQL语句,但我在某些方面陷入困境。 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_request
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))
注意:由于性能限制,为每个花费的时间计算使用不同的选择子查询不是一个选项。必须有另一种方式。
答案 0 :(得分:2)
听起来你只想要像
这样的东西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操作符。
答案 1 :(得分:0)
如果您需要在一行中显示一个组的所有成员,您可以使用GROUP_CONCAT
运算符在MySQL中完成此操作(我不知道Oracle中的等价物是什么):
> SELECT requestID,
GROUP_CONCAT(DATEDIFF(endDate,startDate)) AS length
FROM request_work_log
GROUP BY requestId;
+-----------+--------+
| requestID | length |
+-----------+--------+
| 1 | 2,0,10 |
| 2 | 9 |
+-----------+--------+
(然后将内部联接添加到您的其他表以使用请求名称替换requestID)