2013-06-24 3 views
0

C'est ce que je ...Select count pour une plage de dates où les données ne sont pas dans le reste de la table

SELECT COUNT(DISTINCT customer_number) 
FROM leads 
WHERE (dealer_id = '75' 
      OR dealer_id = '76' 
      OR dealer_id = '77' 
      OR dealer_id = '78' 
      OR dealer_id = '70' 
      OR dealer_id = '2692' 
      OR dealer_id = '2693') 
     AND date BETWEEN '2013-04-01' AND '2013-04-06' 
     AND customer_number NOT IN (SELECT customer_number 
            FROM leads 
            WHERE date < '2013-04-01') 

je fondamentalement juste besoin de faire un compte select où le customer_number est comptée une fois entre la plage de dates mais aussi que le numéro client n'est pas dans le reste de la table.

La requête ci-dessus renvoie juste zéro.

+2

peut-être vous obtenez zéro parce que vous n'avez pas les clients qui satisfont à ces conditions? – akonsu

+2

De même, 'DISTINCT COUNT (customer_number)' doit être remplacé par COUNT (DISTINCT customer_number) '. Mais comme le dit @akonsu, cela n'explique pas pourquoi vous voyez 0 lignes. – PinnyM

+1

ne voulez-vous pas dire «SELECT Count (distinct customer_number)»? – davek

Répondre

0

Je crois que vous voulez SELECT COUNT(DISTINCT customer_number)

Essayez cette requête

SELECT COUNT(DISTINCT customer_number) 
FROM leads 
WHERE (dealer_id = '75' 
      OR dealer_id = '76' 
      OR dealer_id = '77' 
      OR dealer_id = '78' 
      OR dealer_id = '70' 
      OR dealer_id = '2692' 
      OR dealer_id = '2693') 
    AND date BETWEEN '2013-04-01' AND '2013-04-06' 
    AND customer_number NOT IN (SELECT customer_number 
            FROM leads 
            WHERE date < '2013-04-01') 

Modifier nous allons mettre en place votre cahier des charges plus attentivement.

Tout d'abord, exclure tous les clients ayant des prospects périmés chez un concessionnaire. «Stale» signifie avant le premier avril. Deuxièmement, incluez tous les clients à une certaine liste de concessionnaires avec des prospects générés entre la toute première seconde du 1er avril et la toute première seconde du 6 avril. Notez que cela exclut la quasi-totalité du 6 avril si votre colonne date est réellement un horodatage.

Enfin compter les clients uniques. Cela semblerait appeler tous les nouveaux clients vus dans une plage de dates particulière chez certains concessionnaires.

Comment allez-vous résoudre ce problème? Pourquoi ne pas utiliser les deux ensembles de critères séparément?

SELECT customer_number 
    FROM leads 
    WHERE customer_number NOT IN (SELECT customer_number 
            FROM leads 
            WHERE date < '2013-04-01') 

Avez-vous la liste des clients que vous désirez (ceux à inclure)?

Ensuite, essayez ce

SELECT customer_number 
FROM leads 
WHERE (dealer_id = '75' 
      OR dealer_id = '76' 
      OR dealer_id = '77' 
      OR dealer_id = '78' 
      OR dealer_id = '70' 
      OR dealer_id = '2692' 
      OR dealer_id = '2693') 
    AND date BETWEEN '2013-04-01' AND '2013-04-06' 

Ou, mieux encore pour la performance et la correspondance date-heure précise, ceci:

SELECT customer_number 
FROM leads 
WHERE dealer_id IN ('75','76', '77', '78','70','2692','2693') 
    AND date >= '2013-04-01' 
    AND date < '2013-04-06'+ INTERVAL 1 DAY 

ces résultats Inspectez. Vous pouvez trouver votre problème.

+0

Cette requête prend tout son sens, mais je vois toujours 0. Si la requête est correcte, cela signifie que tous les 102 numéros_clients que je trouve lorsque j'exécute la requête sans l'instruction NOT IN présente sont trouvés avant 2013-04- 01. Ce que je sais aussi n'est pas le cas – Urbo425

+0

@ Urbo425 - Quand vous dites 'Ce que je sais aussi n'est pas le cas', avez-vous des preuves de cela? Les deux requêtes que vous avez exécutées * (Une avec le NOT IN, et un sans lui) * *** prouve *** que NOT IN est responsable de l'exclusion des lignes. Je soupçonne que ce que vous ne faites pas * (et demandez ici) * est de mettre la contrainte 'dealer_id' dans la sous-requête. – MatBailie

+0

@MatBailie L'ajout de la contrainte dealer_id dans la sous-requête semble avoir fonctionné. J'ai fait un compte des numéros de client et croisé quelques-uns avec le reste de la table pour trouver que certains des customer_number étaient uniques, ce qui explique pourquoi le retour de zéro n'avait pas de sens. – Urbo425

0

Essayez ceci:

SELECT COUNT (DISTINCT customer_number)

+0

Pourquoi avez-vous mis 'customer_number' entre parenthèses? C'est MySQL, pas SQL-Server. – Barmar

+0

oups !! mon Mauvais merci de le signaler ... :) – vendettamit

1

ou peut-être ...

SELECT COUNT(DISTINCT customer_number) 
    FROM leads 
    LEFT 
    JOIN leads xleads 
    ON xleads.customer_number = leads.customer_number 
    AND xleads.date < '2013-04-01' 
    WHERE leads.dealer_id IN(75,76,77,78,70,2692,2693) 
    AND leads.date BETWEEN '2013-04-01' AND '2013-04-06' 
    AND xleads.customer_number IS NULL; 
+0

+1 pour le 'IN' :) –

+0

Le commentaire du PO à une autre question montre que c'est incomplet, parce que la question/les exigences du PO sont incomplètes. Vous devez également appliquer la contrainte 'dealer' à la référence' xleads'. Ou * (étant donné que l'OP n'a pas été clarifié) * ont 'leads.dealer_id = xleads.dealer_id' dans le prédicat de JOIN. Tout est une supposition, parce que le PO n'a pas été clair sur ce qui est réellement nécessaire. – MatBailie

Questions connexes