2012-01-26 34 views
2

我正在嘗試編寫一條用於構建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 =結束日期(任務(X)) - 的startDate(任務(X))

注:使用不同的選擇子查詢每個花費的時間計算不因爲性能限制的選項。必須有另一種方式。

+0

取決於哪個版本的Oracle,但是您要查找的是查詢數據透視表。 –

+0

@Korhan Ozturk - 0,1和2是硬編碼值嗎?或者他們可以是任何三個taskId值?或者他們可以超過三個taskId值? –

+0

@JustinCave taskIds引用'Tasks'表中的'id'字段。我在編輯這個問題。 –

回答

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運算符。

+0

它的工作原理(儘管有一點修改),謝謝先生。我想知道是否有可能用'decode'來替換'case-when'語句。你怎麼看? –

+0

@KorhanÖztürk - 假設邏輯非常簡單,你可以使用'DECODE'而不是'CASE',因爲它在我的例子中是足夠簡單的。然而,'CASE'更靈活,讓我更容易閱讀。 –

0

如果你需要顯示組的所有成員在一排,你可以在MySQL與GROUP_CONCAT運營商做到這一點(我不知道相當於是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  | 
+-----------+--------+ 

(然後將內部聯接添加到另一個表中,以將請求ID替換爲請求名稱)

相關問題