2009-09-03 7 views
1

J'essaie de déterminer la différence entre les clients facturés au cours des trois derniers mois et l'ensemble de la clientèle. Je suis en mesure de calculer les clients qui ont été facturés en utilisant le SQLDifférence entre deux ensembles de données dans SQL Server 2000

DECLARE @DateFrom AS DATETIME 
SET @DateFrom = 
    CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
    '-' + 
    CAST(MONTH(DATEADD(MONTH, -3, GETDATE())) AS VARCHAR(2)) + '-01', 120) 

DECLARE @DateTo AS DATETIME 
SET @DateTo = 
    CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
    '-' + 
    CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-01', 120) 

SELECT DISTINCT 
    i.CustomerCode 
FROM 
    Invoice AS i 
WHERE 
    (i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo) 

Le tableau ci-dessous que je comparerai contre sera la table client qui a également un champ de CustomerCode.

Merci d'avance!

EDIT

Après avoir passé les âges à essayer de comprendre cela et juste après quelques minutes de ce message ici affichant je l'ai trouvé une solution. En utilisant la clause NOT IN! Dans mon serveur, cela semble fonctionner plus rapidement que les étapes mentionnées ci-dessous lorsque j'ai testé chacun dans Management Studio.

+2

et que voulez-vous exactement? Une liste de tous les clients qui n'ont pas été facturés au cours des 3 derniers mois? Quelle version de SQL Server utilisez-vous? –

+0

Exactement cela. J'utilise SQL Server 2000. Y at-il une meilleure solution à celle que j'ai actuellement? – Malachi

+1

Non, je pense que dans SQL Server 2000, c'est à peu près aussi simple que cela. –

Répondre

3

vous pouvez améliorer votre gestion de rendez-vous avec:

WHERE i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 
    AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 

avis je> = au début, il vous manque des lignes à la date de départ avec un temps 00:00:00.

pour obtenir tous les clients qui ne disposent pas de factures au cours des 3 derniers mois complets, vous pouvez aussi écrire de cette façon:

SELECT 
    c.CustomerCode 
FROM Customer    c 
    LEFT OUTER JOIN Invoice i ON c.CustomerCode=i.CustomerCode 
     AND i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 
     AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 
WHERE i.CustomerCode IS NULL 
+0

la date de manipulation est bonne. Mais la requête doit être modifiée de sorte que la vérification de la plage InvoiceDate fasse partie de la clause ON de LEFT OUTER JOIN et non de WHERE. – van

+0

@van, duh, oui, il ne fonctionnera pas avec lui dans le WHERE, il doit être dans le –

2

Pour les clients qui n'ont pas été facturés pendant une certaine période de temps :

SELECT  c.CustomerCode 
FROM  [Customer] AS c 
LEFT JOIN [Invoice] AS i 
     ON c.CustomerCode = i.CustomerCode 
     AND i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo 
WHERE  i.CustomerCode IS NULL 

Bien que je remplacerais les contrôles de plage de dates @DateFrom and @DateTo avec suggestion de KM pour éviter d'utiliser des variables.

+0

+1, merci pour la correction! –

Questions connexes