2016-11-12 148 views
0

我有STATUS列。值被批准,等待,拒絕。我必須計算機票在PENDING有多少天。Oracle查詢計算天數

ID  Status  Date 
BNM  Pend  11/nov/16 
BNM  Pend  12/nov/16 
ABC  Pend  11/nov/16 
BNM  Pend  12/nov/16 
ABC  Pend  11/nov/16 
ABC  Pend  12/nov/16 
CVD  pend  11/nov/16 
CVD  pend  12/nov/16 
BNM  Pend  10/NOV/16 
ABC  Pend   10/NOV/16 
CVD  Pend   10/NOV/16 
CVD  Approv  09/NOV/16 
CVD  PEND   08/NOV/16 

當我在13/nov/16上運行查詢。

BNM-3 days 
ABC-3 days 
"CVD-5days" (counted as 5 days but it should count as 3 days). 

從11月08計數,但它應該從11月10日16計有上09 11 16開的狀態的更新

Select t.ID,(t.date),t2.nofdays,t1.status 
    from table1 t 
    inner join 
     ( select tt.id,max(tt.days) 
        from table1 tt 
       group by ...)t2 
        on t.id=t2.id 
inner join 
     ( ( select ttt.id,max(ttt.days), count(ttt.days) as noofdays 

        from table1 ttt 
       where status like 'PEND%' 
       group by ...)t2 

      on t1.id=t2.id and t1.date=t2.date 

where trunc(t.date)=trunc(sysdate-1) 
group by .....) 
+0

請定義「票證有多少天待定」。假設「票證」的意思是「ID」(在這種情況下,很容易猜到,但一般情況下請不要讓我們猜測,告訴我們您的數據中「ticket」的含義)。然後 - 「待定」意味着什麼,從最早的狀態「待定」,以便自那之後沒有其他狀態?還有什麼?你如何根據數據來測量「多少天」? (顯示你的查詢很重要,但它不能代替以通俗易懂的語言解釋完整細節中的邏輯。) – mathguy

+0

另外 - 表中的重複行有什麼意義?例如,有兩行BNM,包括Pend狀態和相同日期(12/nov/16),意味着什麼?是否也有可能發生這樣的情況:您有兩行ID,兩者都具有相同的日期但不同的狀態?如果是這樣,哪個優先(哪個來的「之前」其他)? – mathguy

回答

0

讓我們假設你想找到的實際天數計數懸而未決。您可以通過運行該選擇這樣做:

SELECT (MAX(t.status_date) - MIN(t.status_date) + 1) nodays, -- +1 is for adding a current day of pending 
     t.id 
    FROM table1 t 
    JOIN (
     -- For every ID, find max date of not pending status or return "01/01/1900" 
     SELECT t.id, 
       NVL(MAX(CASE 
          WHEN t.status <> 'Pend' THEN 
          status_date 
         END), 
        to_date('01/01/1900', 'dd/mm/yyyy')) max_date 
      FROM table1 t 
     GROUP BY t.id 
     -- 
     ) m 
-- keep only rows that are newer than max_date 
    ON t.id = m.id 
    AND t.status_date > m.max_date 
-- 
GROUP BY t.id; 

這個選擇將返回天數從第一掛起狀態持續掛起狀態。