2014-05-07 53 views
0

我有一個要求來創建要用於生成報告的視圖。該視圖將獲取一個用戶表,並根據用戶標識和訂單標識將其與訂單表和工作流表結合起來。這個觀點很複雜,因爲我需要連接訂單表多次,因爲我需要根據幾種不同的訂單狀態加入。將參數傳遞給加入

我需要能夠獲得每個用戶打開狀態的訂單數量,狀態爲「返回」,「保留」或「返回 - 錯誤」的訂單數量以及每個用戶的每個區域的訂單數量。

獲取所有數據在一起很好我剛剛設置了一個簡單的選擇連接,每個計數要求如下。我的問題是,這將返回表中的所有記錄計數,我需要能夠限制它在一定的時間內將被參數化的訂單。

我需要一些幫助來獲得連接的時間限制。

select u.FIRST_NAME || ' ' || u.LAST_NAME as ASSIGNED_TO, 
u.ID, 
j4.TOTAL_AREA1, 
j1.total, 
j2.TOTAL_OPENED, 
j3.TOTAL_RETURNED 

from users u 
left outer join 
(  
select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO, 
     u1.ID, 
     COUNT(o1.ORDER_KEY) as total 
from users u1, 
    orders o1, 
    WORKFLOW_WORKITEM ww1  

where 
     o1.ORDER_KEY = ww1.ENTITY_KEY_NUM 
     AND ww1.ENTITY_NAME = 'Order' 
     AND ww1.ASSIGNED_TO = U1.ID 

GROUP BY u1.FIRST_NAME, 
     u1.LAST_NAME, 
     u1.id) j1 
on 
j1.ID = u.ID 


left outer join 
(  
select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO, 
     u1.ID, 
     COUNT(o1.ORDER_KEY) as TOTAL_OPENED 
from users u1, 
     ORDERS o1, 
     WORKFLOW_WORKITEM ww1  

where 
     o1.CASE_KEY = ww1.ENTITY_KEY_NUM 
     AND ww1.ENTITY_NAME = 'Order' 
     AND ww1.ASSIGNED_TO = U1.ID 
     AND ww1.STATUS_CODE='S_ORD_CA_021' 

GROUP BY u1.FIRST_NAME, 
     u1.LAST_NAME, 
     u1.id) j2 
on 
j2.ID = u.ID 
left outer join 
(  
select u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_TO, 
     u1.ID, 
     COUNT(o1.ORDER_KEY) as TOTAL_RETURNED 
from users u1, 
     ORDERS o1, 

     WORKFLOW_WORKITEM ww1  

where 
     o1.ORDER_KEY = ww1.ENTITY_KEY_NUM 
     AND ww1.ENTITY_NAME = 'Order' 
     AND ww1.ASSIGNED_TO = U1.ID 
     AND ww1.STATUS_CODE in ('S_ORD_CA_015', 'S_ORD_CA_016', 'S_ORD_CA_017','S_ORD_CA_018') 

GROUP BY u1.FIRST_NAME, 
     u1.LAST_NAME, 
     u1.id) j3 
on 
j3.ID = u.ID 


left outer join 
(
select 
     u1.ID, 
     COUNT(o1.ORDER_KEY) as TOTAL_AREA1 

from users u1, 
     ORDERS o1, 
     WORKFLOW_WORKITEM ww1, 
     domains dm 

where 
     o1.ORDER_KEY = ww1.ENTITY_KEY_NUM 
     AND ww1.ENTITY_NAME = 'Order' 
     AND ww1.ASSIGNED_TO = U1.ID 
     and ww1.DOMAIN_ID=dm.ID 
    AND dm.CODE='AREA1' 

GROUP BY 
     u1.FIRST_NAME, 
     u1.LAST_NAME, 
     u1.id, 
     ww1.DOMAIN_ID, 
     dm.DESCRIPTION 
     ) j4 
on 
j4.ID = u.ID 

回答

0

基本上你要添加的東西,如:

o1.DATE between :param_from and :param_to 

在每一個 '秩序' 子查詢。 :notation是oracle參數的標準,但參數如何綁定取決於您用來執行查詢的環境。所以請寫下你使用的環境/工具。

您可以嘗試simplyfy查詢(我希望我沒有做任何語法錯誤,我寫在記事本...):

select 
    ASSIGNED_USER, 
    UID, 
    count(AREA1) TOTAL_AREA1, 
    count(1) TOTAL, 
    count(OPENED) TOTAL_OPENED, 
    count (RETURNED) TOTAL_RETURNED 
from 
    (
    select 
     u1.id UID, 
     u1.FIRST_NAME || ' ' || u1.LAST_NAME as ASSIGNED_USER, 
     case when dm.CODE='AREA1' then 1 else null end AREA1, 
     case when ww1.STATUS_CODE='S_ORD_CA_021' then 1 else null end OPENED, 
     case when ww1.STATUS_CODE in 
      ('S_ORD_CA_015', 'S_ORD_CA_016', 'S_ORD_CA_017','S_ORD_CA_018') then 1 
      else null end RETURNED 
    from users u1 
     left outer join WORKFLOW_WORKITEM ww1 on AND ww1.ASSIGNED_TO = U1.ID 
      AND ww1.ENTITY_NAME = 'Order' 
     left outer join orders o1 on o1.ORDER_KEY = ww1.ENTITY_KEY_NUM 
     left outer join domains dm on ww1.DOMAIN_ID=dm.ID 
    where 
     o1.DATE between :param_from and :param_to 
     -- you can add any other conditions that may 
     -- cut number of selected records 
     -- to minimum required to get expected results 
    ) 
group by UID, ASSIGNED_USER; 
+0

的答覆十分感謝。我使用dbvisualizer來執行sql。我明白你的意思了,我明天當我回到辦公室並隨時更新時,我會明白這一點。 – briansexton

+0

在本網站的變量部分中,您可以找到如何在dbvisualizer中綁定參數的說明:http://www.dbvis.com/doc/7.1/doc/ug/sqlCommander/sqlCommander.html#mozTocId637655它說你應該使用' $ {notation} $',所以你的參數行應該看起來像這樣: 'o1.DATE to_date($ {param_from} $,'YYYY-MM-DD')和to_date($ {param_to} $' YYYY-MM-DD')'(我推薦使用'to_date'函數,所以你可以明確指定日期格式)。 – Bru