2009-11-02 20 views
0

我正在做一些入站呼叫需求獲取系統的工作,每個呼叫可能有一個或多個需求鏈接到它。出於100個要求的樣本,還有什麼要求?

有一個帶CallDate,CallReference和CaptureID的CaptureHeader表,以及一個CaptureID和DemandID的CaptureDemand表。

編輯:
我增加了一些有代表性的數據顯示什麼會在每個表中可以預期的。

CaptureHeader

CaptureID | CallReference | CallDate 
----------------------------------------------- 
1   | 1    | 2009-11-02 20:37:00 
2   | 3    | 2009-11-02 20:37:05 
3   | 2    | 2009-11-02 20:37:10 
4   | 4    | 2009-11-02 20:38:00 
5   | 5    | 2009-11-02 20:38:30 

CaptureDemand

DemandID | CaptureID | DemandText 
------------------------------------ 
1  | 1   | Fund value 
2  | 2   | Password reset 
3  | 2   | Fund value 
4  | 3   | Change address 
5  | 3   | Fund value 
6  | 3   | Rate change 
7  | 3   | Fund value 
8  | 4   | Variable to fixed 
9  | 4   | Change address 
10  | 5   | Fund value 
11  | 5   | Address change 

使用上 '基金值' a過濾器上方的表將帶回的呼叫引用1,2,3,3,5,因爲3具有兩個基金價值。

如果我做了這樣的不同,因爲我已按日期排序它會問我表明,這也會給我兩行3

要獲得完整的數據我會做以下查詢:

SELECT * FROM CaptureHeader AS ch 
JOIN CaptureDemand AS cd ON ch.CaptureID = cd.CaptureID 
JOIN DemandDetails AS dd ON cd.DemandID = dd.DemandID 

我想雖然是按日期獲取最後100個特定需求的標題。在這種情況下,棘手的是當一個標題上有多個相同的需求時,可能會有特定的參考。

我想要100個獨特的調用引用,因爲那麼我需要找回那些調用引用的所有需求,然後計算在同一個調用中還記錄了多少個其他需求。

編輯:
我想能夠說 'WHERE DemandID = someValue中' 選擇我的100個引用。

換句話說,在100個「價值要求」要求中還要求提供其他要求。如果這沒有意義,請告訴我,我會嘗試修改問題以使其更清晰。

我想獲得一個表是這樣的:

Demands   | Count 
------------------------ 
Demand asked for | 100 
Another demand | 36 
Third demand  | 12 
Fourth demand | 6 

乾杯,伊恩。

+0

也許一些樣本數據會有所幫助?我不能完全跟隨你。 聽起來像是捕獲和需求是M:N - 但是您允許捕獲 - 需求ID對在連接表中重複。如果在連接表中有一個「count」列來表示特定匹配發生了多少次關係,會更容易嗎? – Mikeb 2009-11-02 18:56:46

+0

聲明「我希望通過特定需求獲得最後100個標題」與您提供的示例輸出表不匹配。 – RedFilter 2009-11-02 18:57:27

+0

我一直在看它分兩部分。第一部分我試圖從我的示例集的頭表中獲取100個調用引用。然後,我將使用這些引用的捕獲ID來查找CaptureDemand表中的需求。然後,我通過出現次數降序對數據進行排序。在一個理想的世界裏,我所要求的需求會有100個,然而其他要求卻少於其他需求,但可能不是這樣。 – 2009-11-02 19:02:16

回答

1

現在,示例數據使您的需求更加明確,我相信以下服務通常會滿足您的需求。它與之前的提交基本相同,在JOIN上增加了一個條件;此條件基本上不包括任何我們隨時可以擁有相同DemandText的CaptureDemand行(在同一Capture中),只保留具有最低DemandId的行。

WITH myCTE (CaptId, NbOfDemands) 
AS (
    SELECT CaptureID, COUNT(*) -- Can use COUNT(DISTINCT DemandText) 
    FROM CaptureDemand 
    WHERE CaptureID IN 
    (SELECT TOP 100 C.CaptureID 
    FROM CaptureHeader C 
    JOIN CaptureDemand D ON C.CaptureID = D.CaptureID 
     AND NOT EXISTS (
      SELECT * FROM CaptureDemand X 
      WHERE X.CaptureId = D.CaptureId AND X.DemandText = D.DemandText 
       AND X.DemandId < D.DemandId 
     ) 
    WHERE D.DemandText= 'Fund Value' 
    ORDER BY CallDate DESC) 
) 

SELECT NbOfDemands, COUNT(*) 
FROM myCTE 
GROUP BY NbOfDemands 
ORDER BY NbOfDemands 

什麼這個查詢提供: 其中有一個準確的需求 其中有整整兩個要求 捕獲的數量捕獲的數量.. 正好有n個需求的捕獲數

對於包含特定值'someValue'的需求的100個最近捕獲(並且,這次確實給出了100個,即,在計算情況下不計算相同的CaptureID兩次需求類型中的dups)。

的幾點:

  • 您可能希望在CTE的選擇列表中使用COUNT(DISTINCT DemandText),而不是COUNT(*)。 (我們確實包含了100個不同的CaptureID,即您的示例中的Capture#3沒有出現兩次,因此在列表的末尾隱藏了另一個捕獲,但我們需要知道這個#3 Capture是否應該算作3個需求或4個需求捕獲)。
  • 哎呀,你需要的不是很什麼,因爲每行顯示,有這個量需求的準確捕獲實例的數量...
  • 使用上NbOfDemands的例子,用來顯示文本如問題(簡單)
  • 這可能會顯示超過4個需求的Capture實例,但這可能是一個加號(如果有),但這可能是一個加號
  • 如果例如沒有給定數量的Capture實例的要求。
+0

感謝@mjv爲您的解決方案。然而,我需要在'SELECT TOP 100 CaptureID FROM CaptureHeader ORDER BY Time_of_Capture DESC'中說'WHERE DemandID = SomeValue',並且因爲我可以有超過1個相同需求的呼叫,所以我不會以100獨特的參考。我嘗試使用DISTINCT,但我被要求把我不想要的日期時間。 – 2009-11-02 19:11:59

+0

我會用這一點來修改這個問題 - 我沒有說清楚。 – 2009-11-02 19:12:57

+0

@Ian看我的編輯。我認爲這會起作用,除非我錯過了一些細微的(或不那麼微妙;-))要求。 – mjv 2009-11-02 19:22:13

0

這聽起來像你試圖解決多對多只有兩個表的問題,你真的需要三個表。例如:

表的調用

CallId | CallDate 
---------------------------- 
1  | 2009-11-02 20:37:00 
2  | 2009-11-02 20:37:05 
3  | 2009-11-02 20:37:10 
4  | 2009-11-02 20:38:00 
5  | 2009-11-02 20:38:30 

表請求

RequestId | RequestType 
---------------------------- 
1   | Fund value 
2   | Password reset 
3   | Change address 
4   | Rate change 
5   | Variable to fixed 

表CallRequests(解析多對多)

CallId |RequestId 
----------------- 
1  |1   
2  |2  
2  |1  
3  |3  
3  |1  
3  |4 
3  |1 
4  |5 
4  |3 
5  |1 
5  |3  

這個數據結構將讓你從查詢事物的呼叫方和事物的請求方。