count distinct avec groupe par

J'ai déjà cherché SO mais je n'ai trouvé aucune réponse à ma question. Ma question est si j'utilise la requête ci-dessous, je reçois le count correct qui est de 90:

select count(distinct account_id) from FactCustomerAccount f join DimDate d on f.date_id = d.datekey -- 90 

Mais quand je groupe par CalendarYear comme ci-dessous, il me manque 12 chefs d'accusation. La requête et la sortie sont ci-dessous:

 select CalendarYear,count(distinct account_id) as accountCount from FactCustomerAccount f join DimDate d on f.date_id = d.datekey group by CalendarYear output: CalendarYear accountCount 2005 10 2006 26 2007 49 2008 63 2009 65 2010 78 

Je ne sais pas pourquoi il me manque 12 chefs d'accusation. Pour déboguer, j'exécute la requête suivante si j'ai manqué date_id dans FactCustomerAccount mais n'ai trouvé aucune key manquante:

 select distinct f.date_id from FactCustomerAccount f where f.date_id not in (select DateKey from dimdate d) 

J'utilise SQL Server 2008 R2. Quelqu'un peut-il suggérer ce qui pourrait être la raison de manquer 12 chefs d'accusation? Merci d'avance.

EDITER UN:

Je n'ai pas bien compris la raison / réponse donnée à ma question dans les 2 réponses, donc je voudrais append 2 requêtes ci-dessous en utilisant AdventureWorksDW2008R2 où il n'y a pas de count:

 select count (distinct EmployeeKey) from FactSalesQuota f join dimdate d on f.DateKey = d.DateKey -- out: 17 select d.CalendarYear, count (distinct EmployeeKey) as Employecount from FactSalesQuota f join dimdate d on f.DateKey = d.DateKey group by d.CalendarYear -- out: -- CalendarYear Employecount -- 2005 10 -- 2006 14 -- 2007 17 -- 2008 17 

Alors s'il vous plaît corrigez-moi ce que je manque.

Vous ne manquez pas 12. Il se pourrait que certains counts n'aient pas eu d'activités dans les dernières années.

Vos requêtes sont très différentes:

La première:

 select count(distinct account_id) from FactCustomerAccount f join DimDate d on f.date_id = d.datekey 

Renvoie le nombre de counts différents (sur toutes les années), donc si vous avez un account_id présent dans deux ans, vous avez 1 (count) returnné.

La deuxième:

Regroupé par CalendarYear donc si vous avez un account_id dans deux années différentes, cette information va dans deux lignes différentes.

 select CalendarYear,count(distinct account_id) as accountCount from FactCustomerAccount f join DimDate d on f.date_id = d.datekey group by CalendarYear 

MODIFIER

J'essaie d'expliquer mieux:

Je suppose que cet set de données de couple de command: (année, account_id)

 `2008 10` `2009 10` `2010 10` `2010 12` 

Si vous exécutez deux requêtes supérieures, vous avez:

 `2` 

et

 `2008 1` `2009 1` `2010 2` 

parce qu'il existe deux account_id différents (10 et 12) et seulement dans la dernière année (2010) account_ids 10 et 12 ont écrit leurs lignes.

Mais si vous avez cet set de données:

 `2008 10` `2009 10` `2009 12` `2010 12` 

Tu vas avoir:

Premier résultat de la requête: 2

Deuxième résultat de la requête: 2008 1 2009 2 2010 1

je dirai pour parsingr ceci, vérifier le nombre de rows.check calender column.Is-ce qu'il y a des lignes avec null dans calenderyear. ou essayer le rang, je ne suis pas sûr

 select *, ROW_NUMBER()over(partition by CalendarYear,account_id order by CalendarYear) from FactSalesQuota f join dimdate d on f.DateKey = d.DateKey