我正在对入站呼叫需求捕获系统做一些工作,其中每个呼叫可能有一个或多个与之相关的需求。
有一个带有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
使用上面的表格,“基金价值”的过滤器会带回1,2,3,3,5的看涨期权,因为3有两个基金值。
如果我对此做了DISTINCT,因为我按日期订购了它会要求我显示哪个也会给我两行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 :(得分: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个MOST近期捕获(并且,这次,确实给出100,即在需求类型的重复情况下不计算相同的CaptureID两次)。
几点:
答案 1 :(得分:0)
听起来你只想用两张桌来解决多对多问题而你真的需要三张桌子。例如:
TABLE Calls
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
TABLE请求
RequestId | RequestType
----------------------------
1 | Fund value
2 | Password reset
3 | Change address
4 | Rate change
5 | Variable to fixed
TABLE 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
这个数据结构可以让你从Call方面查询事物,也可以从Request方面查询。