我已经搜索了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
所以请纠正我错过的内容。
答案 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