2014-12-31 3 views
0

У меня есть две таблицы измерений и одна таблица фактов следующим образом:звезда вопрос агрегации схемы

drop table if exists ref; 
create table ref (country_id int not null, id_ref int not null); 

insert into ref values(1,1); 
insert into ref values(1,2); 

drop table if exists conv; 
create table conv (country_id int not null, id_ref int not null,id_conv int not null,item varchar(25)); 

insert into conv values (1,1,1,'AA'); 
insert into conv values (1,2,2,'CC'); 
insert into conv values(1,2,3,'CA'); 
insert into conv values(1,2,4,'CA'); 

drop table if exists fact; 
create table fact as 
select 
r.country_id,c.item, 
count(distinct r.id_ref) refs, 
count(distinct c.id_conv) convs 
from ref r 
left join conv c 
on r.country_id=c.country_id 
and r.id_ref=c.id_ref 
group by 1,2; 

запрос, чтобы получить результаты:

select f.country_id, sum(f.refs) refs,sum(f.convs) convs 
from fact f 
group by 1; 

Результат выше запроса является 1,3,4

, но я ожидал 1,2,4

Как гр я достигаю ожидаемых результатов, или мои понятия ошибочны?

+0

Можете ли вы объяснить, почему вы ожидаете 1,2,4? У вашей таблицы фактов явно есть 3 результата для ссылок, сумма которых будет равна 3 ... Зачем вам нужно группировать по элементам вообще - не будет ли это работать (получается 1,2,4): http: // sqlfiddle. com/#! 2/22d3e8/3 – sgeddes

+0

, потому что таблица ref имеет только две строки, поэтому, если я их подсчитаю, я должен получить 2 как счет id_ref – Developer

ответ

0

Я думаю, что у вас есть ошибка в:

create table fact as 
select 
r.country_id,c.item, 
count(distinct r.id_ref) refs, 
count(distinct c.id_conv) convs 
from ref r 
left join conv c 
on r.country_id=r.country_id 
and r.id_ref=c.id_ref 
group by 1,2; 

Пожалуйста, попробуйте

left join conv c 
    on r.country_id=c.country_id 
    and r.id_ref=c.id_ref 

вместо

left join conv c 
    on r.country_id=r.country_id 
    and r.id_ref=c.id_ref 

(следующая часть выглядит как ошибка r.country_id=r.country_id - всегда верно выражение)

0

Ваше исключение неверно в этом запросе. Вы присоединяетесь к двум столам по стране. Они составят 4 записи. после группы по стране & пункт, будет три записи.summarize различные refid с пунктом. фактический результат правильный.

 
country_id item refs convs 
1 AA 1 1 
1 CA 1 2 
1 CC 1 1 

Для Вашего ожидания, запрос будет

select 
 
r.country_id, 
 
count(distinct r.id_ref) refs, 
 
count(distinct c.id_conv) convs 
 
from ref r 
 
left join conv c 
 
on r.country_id=c.country_id 
 
and r.id_ref=c.id_ref 
 
group by r.country_id

Смежные вопросы