有趣且具有挑战性的自联接问题SQL Server 2005

Cod*_*ome 3 sql join sql-server-2005

我有这个名为OrdersToCall的

数据类型:除日期时间之外的所有bigints

|-Order Num-|----Date--- |- Primary Ph -| Secondary Ph | Alternate Ph
|----101----| 02-07-2010 | 925-515-1234 | 916-515-1234 |  707-568-5778  
|----102----| 02-07-2010 | 925-888-4141 | 925-888-4141 |  000-000-0000
|----103----| 02-07-2010 | 000-000-0000 | 000-000-0000 |  510-555-4575  
|----104----| 02-07-2010 | 415-789-5454 | 415-707-5588 |  735-874-9566
|----105----| 02-07-2010 | 925-887-7979 | 925-887-7979 |  925-887-7979

我有另一个名为PhoneNumCalled的

|-AgentID-|----Date----|-Dialed Number|
|-145564--| 02-07-2010 | 925-515-1234 |
|-145564--| 02-07-2010 | 707-568-5778 |
|-145566--| 02-07-2010 | 925-888-4141 |
|-145567--| 02-07-2010 | 510-555-4575 |
|-145568--| 02-07-2010 | 415-789-5454 |
|-145568--| 02-07-2010 | 415-707-5588 |
|-145568--| 02-07-2010 | 735-874-9566 |
|-145570--| 02-07-2010 | 925-887-7979 |
|-145570--| 02-07-2010 | 925-887-7979 |

现在我的挑战是:我想要计算有多少Order Num被调用并根据结果创建一个表.

因此,例如,如果代理1234在1个订单上调用所有3个数字,那么该代理仍将仅计为1个订单.比例为1:1.一旦拨打电话号码,它就被计为1个订单.无论是否所有3个都被呼叫,代理商只需拨打1个电话号码即可获得订单信用.

在不到3个月的时间里,我已经有近1/2万的记录,所以尽可能地考虑空间.

我的解决方案(我希望在你的帮助下进行修改):
我最终创建了一个存储过程:

--Delete and recreate the CombinedData table created yesterday
Insert into the CombinedData table
Select Order Num, Date, Primary Ph as Phone
 from OrdersToCall
Union
Select Order Num, Date, Secondary Ph as Phone
 from OrdersToCall
Union
Select Order Num, Date, Alternate Ph as Phone
 from OrdersToCall
Delete from the CombinedData table
 where phone in ('000-000-0000', '999-999-9999')
Run Code Online (Sandbox Code Playgroud)

现在,这不仅会创建一个新表,而且由于每个订单中的每个电话号码现在都是自己的行,因此该表变为巨大,最多需要2分钟才能创建.

然后从这个表中我得出计数并将它们存储在另一个表中.

Gab*_*abe 6

我想这就是你要找的东西:

SELECT c.AgentId, COUNT(DISTINCT o.[Order Num]) AS [Orders per Agent]
FROM OrdersToCall o
JOIN PhoneNumCalled c ON c.[Dialed Number] = o.[Primary Ph]
                      OR c.[Dialed Number] = o.[Secondary Ph]
                      OR c.[Dialed Number] = o.[Alternate Ph]
GROUP BY c.AgentId
Run Code Online (Sandbox Code Playgroud)

如果您想知道每个日期的通话次数,您还必须加入日期:

SELECT c.AgentId, c.Date, COUNT(DISTINCT o.[Order Num]) AS [Orders per Agent]
FROM OrdersToCall o
JOIN PhoneNumCalled c ON (c.[Dialed Number] = o.[Primary Ph]
                      OR c.[Dialed Number] = o.[Secondary Ph]
                      OR c.[Dialed Number] = o.[Alternate Ph])
                      AND o.Date = c.Date
GROUP BY c.AgentId, c.Date
Run Code Online (Sandbox Code Playgroud)