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

时间:2010-09-13 21:31:41

标签: sql sql-server-2005 join

我将此表命名为 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')

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

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

1 个答案:

答案 0 :(得分: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

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

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