2014-02-06 81 views
1

你好我有我希望的是一個有趣的問題(好幾個問題是準確的),我希望有人能幫助我。我目前正在從Crystal數據庫中獲取數據的Crystal Reports 2008中使用SQL。Oracle SQL - 最大和最小數量的記錄列表

我需要獲得在特定時間段內完成特定最小測試次數(例如超過10次測試)的員工列表。爲了進一步解決這個問題,它必須是最近的10次測試,並且我還需要列出每個獨特的測試參考。

我已經做了一個開始(參見第一段代碼及其輸出),它使用了行號()函數,但這隻顯示單個員工編號的10條最新信息,並且不檢查是否需要已經進行了10次測試。

我還製作了另一段代碼(請參閱第二段代碼及其輸出),其中包含一個計數功能,並且僅顯示那些進行過至少10次測試的員工。

我真的需要在所需的輸出表所示的情況:

所以我的問題/問題是:

  1. 是否有修改我的原代碼,以便將更多的工作方式比一個職員號碼?

  2. 是否有合併這兩段代碼的方法,以便它檢查是否已完成所需數量的測試並僅顯示符合所需條件的員工編號和測試引用(這是首選選項)?

  3. 我是否必須放棄這個想法並重新開始?

不幸的是我目前還沒有對數據庫管理員訪問權限,不能創建任何新的數據表來存儲此類數據,所以我需要這在一個SQL動作來完成的,如果可能的話。

我附上了一個電子表格,其中顯示了可用數據的快照,如果這有幫助。

任何幫助,你可以給我,這將不勝感激。

WITH TESTNUMBER AS 
(SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO=405405 AND  
(PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND 
PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'}) 

SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10;` 

STAFF_NO TEST_REF DATE_OF_TEST SLOT_TIME  
405405 01 05/08/2013 08:40:00 
405405 02 05/08/2013 09:40:00 
405405 03 05/08/2013 10:40:00 
405405 04 06/08/2013 08:40:00 
405405 05 06/08/2013 09:40:00 
405405 06 06/08/2013 10:40:00 
405405 07 06/08/2013 11:40:00 
405405 08 07/08/2013 08:40:00 
405405 09 07/08/2013 09:40:00 
405405 10 07/08/2013 10:40:00 

查詢:

SELECT TESTER.STAFF_NO, count(TESTER.STAFF_NO) AS TOTALTESTS FROM 
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE (PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND PERIOD.DATE_OF_TEST<= 
{ts '2013-08-10 00:00:00'}) 
GROUP BY TESTER.STAFF_NO   
HAVING count(TESTER.STAFF_NO)>=10 
ORDER BY TESTER.STAFF_NO DESC` 

STAFF_NO TEST_REF   
405405 12   
366255 14  

總體要求的輸出

STAFF_NO TEST_REF DATE_OF_TEST SLOT_TIME  
405405 03 05/08/2013 10:40:00  
405405 04 06/08/2013 08:40:00 
405405 05 06/08/2013 09:40:00  
405405 06 06/08/2013 10:40:00 
405405 07 06/08/2013 11:40:00 
405405 08 07/08/2013 08:40:00 
405405 09 07/08/2013 09:40:00 
405405 10 07/08/2013 10:40:00 
405405 11 08/08/2013 08:40:00 
405405 12 08/08/2013 09:40:00 
366255 17 06/08/2013 09:40:00 
366255 18 06/08/2013 10:40:00 
366255 19 06/08/2013 11:40:00 
366255 20 06/08/2013 12:40:00 
366255 21 09/08/2013 08:40:00 
366255 22 09/08/2013 09:40:00 
366255 23 09/08/2013 10:40:00 
366255 24 09/08/2013 12:40:00 
366255 25 09/08/2013 14:40:00 
366255 26 09/08/2013 15:40:00 

很抱歉,如果這看起來不是很專業,但我是新來這個。

再次感謝您的幫助。

回答

0

這是什麼,但合併版本的兩個查詢。

對於問題#1

WITH TESTNUMBER AS 
(SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (PARTITION BY TESTER.STAFF_NO ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO in (405405, 366255) AND  
(PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND 
PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'}) 
SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10 
ORDER BY STAFF_NO,RowNumber 

問題2

WITH TESTNUMBER AS 
(
SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (PARTITION BY TESTER.STAFF_NO ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO in (
          SELECT TESTER.STAFF_NO FROM 
          FROM dB1.TEST_EVENT TESTER  
          INNER JOIN dB1.PERIOD PERIOD 
           ON TESTER.PERIOD_ID = PERIOD.PERIOD_ID 
          INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT 
           ON TESTER.SLOT_TIME_ID = TESTSLOT.SLOT_TIME_ID) 
          WHERE (PERIOD.DATE_OF_TEST >= {ts '2013-08-01 00:00:00'} 
          AND PERIOD.DATE_OF_TEST <= {ts '2013-08-10 00:00:00'}) 
          GROUP BY TESTER.STAFF_NO   
          HAVING count(TESTER.STAFF_NO)>=10 
         ) 
AND (PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} 
AND PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'} 
) 
SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10 
ORDER BY STAFF_NO,RowNumber 
+0

你好OracleUser –

+0

是@戴夫-69! –

+0

你好,我試圖通過這個評論張貼我的迴應,並被告知它太長了,我會爲此使用「回答你的問題」。 –