与group by的明显计数

时间:2014-02-28 08:25:01

标签: sql sql-server sql-server-2008

我已经搜索了SO,但没有找到我的问题的答案。我的问题是,如果我使用下面的查询,我得到正确的计数,即90:

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

-- 90

但是当我按照下面的CalendarYear进行分组时,我错过了12个计数。查询和输出如下:

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

我不确定为什么我缺少12项罪名。要调试我运行以下查询,如果我在FactCustomerAccount中缺少date_id但发现没有丢失的键:

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

我正在使用SQL Server 2008 R2。 任何人都可以建议错过12个计数的原因是什么? 提前谢谢。

编辑一:

我不太明白2回复中我的问题的原因/答案所以我想在下面使用AdventureWorksDW2008R2添加2个查询,其中没有计数缺失:

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

所以请纠正我错过的内容。

3 个答案:

答案 0 :(得分:3)

您的查询非常不同:

第一个:

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

返回不同帐户的计数(全年),因此如果您在两年内有一个account_id,则返回1(计数)。

第二个:

由CalendarYear分组,因此如果您在两年内有一个account_id,则此信息会分为两行。

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

修改

我试着更好地解释一下:

我认为这个订单数据集是:(year,account_id)

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

如果你运行两个上层查询,你有:

`2`

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

因为存在两个不同的account_id(10和12),并且仅在去年(2010年)中,account_ids 10和12已经写了他们的行。

但是如果你有这个数据集:

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

你将拥有:

首先查询结果:     2

第二个查询结果:     2008 1     2009 2     2010 1

答案 1 :(得分:1)

你没有错过12.可能有些账户在最后几年没有活动。

答案 2 :(得分:1)

我会说要分析一下,检查行数。检查日历列。在calenderyear中是否有任何行为null。或者尝试排名,我不确定

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