在100个样本的样本中,还有其他要求的内容?

时间:2009-11-02 18:42:51

标签: sql sql-server

我正在对入站呼叫需求捕获系统做一些工作,其中每个呼叫可能有一个或多个与之相关的需求。

有一个带有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

干杯,伊恩。

2 个答案:

答案 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两次)。

几点:

  • 您可能希望在CTE的选择列表中使用COUNT(DISTINCT DemandText)而不是COUNT(*)。 (我们确实包含100个不同的CaptureID,即样本中的Capture#3不会出现两次因此在列表末尾隐藏另一个捕获,但是我们需要知道这个#3 Capture是否应该算作3个需求或4要求捕获)。
  • 哎呀,不完全符合您的要求,因为每一行都显示了完全此需求量的Capture实例数...
  • 在NbOfDemands上使用CASE来显示问题中的文本(琐碎)
  • 这可能会显示具有超过4个要求的Capture实例,但这可能是一个加号(如果有的话),但这可能是一个加号
  • 如果没有具有给定请求数的Capture实例,则不会显示0。

答案 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方面查询。