如何根据不同的标准从同一个表的不同行检索数据

时间:2012-01-26 21:31:29

标签: sql database oracle oracle10g

我正在尝试编写一个用于构建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))

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

2 个答案:

答案 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)

相关问题