0
votes

Comment ne puis-je pas double compter des lignes et des objets dans ma requête?

Je cherche à compter un certain nombre d'instances pour un groupe de personnes qui avaient une demande par mois, mais je ne veux que compter cela une fois plutôt que souvent, la personne a demandé quelque chose. Voici un exemple de ma table de données, donc cela pourrait avoir plus de sens

July19    August19    Septemeber19
4           3            2


2 commentaires

Pourquoi le premier est-il compté comme "juillet" alors que le troisième est compté comme "septembre"? Le dernier ne devrait-il pas être "octobre"? Pas clair pour moi comment vous attribuez le mois à chaque demande.


distinct avec un groupe par est (presque) toujours redondant et signifie normalement que votre groupe par est faux. Dans ce cas, c'est le premier.


3 Réponses :


1
votes

Vous pouvez utiliser compter (distinct) et simplifier radicalement la logique de comparaison de la date. Je suis sûr que vous voulez que vous souhaitiez des clients qui se chevauchent du tout avec les mois, donc: xxx


2 commentaires

Je reçois le même problème mentionné ci-dessous, compte d'un par mois, quoi qu'il arrive. Voir les modifications.


@ Ziegler199. . . Utilisez Count (*) . Comme la réponse originale essayait de suggérer, compter (distinct) ne semblait pas approprié.



0
votes

Vous accédez à plusieurs reprises de la même table, cela peut être simplifié en utilisant l'agrégation conditionnelle em>. De plus, vous souhaitez probablement vérifier si la demande de démarrage / extrémité se chevauche avec un mois donné. En ce qui concerne votre une fois par client em>, cela peut être fait en utilisant distnct:

Select client,       
       count(distinct CASE WHEN RequestEndDate >= '2019-07-01'
                       AND RequestStartDate  < '2019-08-01'
                      then "Customer ID" end) AS July19, -- don't know if this matches your logic, once per customer?
       count(distinct CASE WHEN RequestEndDate >= '2019-08-01' -- overlap calculation
                       AND RequestStartDate  < '2019-09-01'
                      then "Customer ID" end) AS Aug19,
       count(distinct CASE WHEN RequestEndDate >= '2019-09-01'
                       AND RequestStartDate  < '2019-10-01'
                      then "Customer ID" end) AS Sep19
from #testdata21234
group by client;


4 commentaires

Cela réduit donc le nombre de «1» chaque mois. Filtrage à travers des résultats 30K, ce n'est pas correct. Dans mon exemple, je suppose que cela fonctionnerait mais pour une taille d'échantillon plus complexe plus complexe, cela n'a pas fonctionné.


Cela réduit le nombre de '1' chaque mois : S'il y a une relation 1-1 entre le client et le client, oui. Vous devez expliquer votre logique


Voir les modifications. Désolé pour la confusion. Merci pour votre aide jusqu'à présent


Vos modifications montrent que le résultat renvoyé par My Select, le nombre d'identifiants de clients distincts pour chaque mois



0
votes

Je pense que le code de codage de chaque mois n'est pas une bonne logique SQL, vous devez utiliser groupe par code> et format code> (voir le format de la date) . Donc, si, par exemple, vous essayez de compter le nombre de clients commencés chaque mois, vous devez faire quelque chose comme ceci:

SELECT 
    FORMAT(g."RequestStartDate",'MMMM yy') month_year,
    COUNT(DISTINCT g."Customer ID") count_clients
FROM #testdata21234 g
GROUP BY 1


0 commentaires