2010-09-13 2 views
3

Je possède ce tableau nommé OrdersToCallauto intéressant et stimulant joindre problème SQL Server 2005

types de données: Tous bigints, sauf pour ce jour qui est un datetime

|-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 

et j'ai une autre table nommée 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 | 

maintenant, mon défi est: Je veux compter combien de Order Num ont été appelés et créer une table basée sur les résultats. Ainsi, par exemple, si l'agent 1234 appelait tous les 3 numéros sur 1 ordre, cela ne compterait encore que pour 1 ordre pour cet agent. Le ratio est 1: 1. Une fois qu'un numéro de téléphone est appelé, il est compté comme 1 commande. Peu importe si tous les 3 ont été appelés, un agent doit seulement appeler 1 des numéros de téléphone pour obtenir un crédit pour la commande.

En moins de 3 mois, j'ai déjà presque 1/2 million d'enregistrements, alors essayez d'être le plus conscient possible de l'espace.

Ma solution (que je souhaite revoir avec votre aide):
J'ai fini par créer une procédure stockée qui:

--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') 

Maintenant, non seulement cela créer une nouvelle table, mais étant donné que chaque numéro de téléphone dans chaque ordre est maintenant sa propre rangée la table devient énorme et prend jusqu'à 2 minutes pour créer. Puis, à partir de cette table, je dérive les comptes et les stocke dans une autre table.

+0

Ajoutez plus d'informations sur votre défi. Un peu plus de logique métier et comment fonctionne le comptage. –

+0

Quels critères faut-il pour pouvoir compter plus d'un sur une commande? Si n'importe où de 1-3 des nombres associés appelés encore égal à un, alors c'est un rapport de 1: 1 jusqu'à ce que vous puissiez expliquer autrement. –

Répondre

6

Je pense que c'est ce que vous cherchez:

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 

Si vous voulez savoir combien d'appels ont été faits à chaque date, vous devez joindre à la date aussi:

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 
+0

Je pense qu'il devrait être 'COUNT (DISTINCT o. [Numéro de commande])'. –

+0

Comment est-ce que je modifierais ceci pour faire correspondre les colonnes de date aussi? Où irait l'ET? – CodingIsAwesome

+0

Bon point, Mark. – Gabe