2014-12-06 5 views
1

У меня есть две таблицы:SQL: число() и группа по

BLOCKQUOTE s1: (разные пользователи используют другой браузер на какое-то время)

browser time 
1 opera 1 
2 opera 1 
3 opera 3 
4  d 4 
5  d 5 
6 opera 6 
7 opera 7 
8  d 8 
9 opera 9 
10 opera 10 
11  d 11 
12  d 12 
13  d 13 
14  d 14 
15 opera 15 

BLOCKQUOTE s2 : (время, когда используется операционная система браузера)

opera time 
1  1 1 
2  1 1 
3  1 3 
4  1 6 
5  1 7 
6  1 9 
7  1 10 

Я хочу узнать количество опер, используемых в разное время. (Если в момент времени 2, никто не использовать оперу, он должен иметь 0 там.)

Blockquote

Select s1.time, count(s2.opera) 
From s1 left join s2 on s1.time=s2.time 
Group by s1.time 

Тогда у меня есть это:

> Blockquote 
> dddd 
    time  count (s2.opera) 
1  1    4 
2  3    1 
3  4    0 
4  5    0 
5  6    1 
6  7    1 
7  8    0 
8  9    1 
9 10    1 
10 11    0 
11 12    0 
12 13    0 
13 14    0 
14 15    1 

Который не является правильно, потому что в момент 1, опера должна иметь только 2 счета вместо 4. Я не знаю, где пошло не так.

+0

Вы должны объяснить проблему более ясным образом. Однако, угадывая, в чем вы нуждаетесь, вам нужно посмотреть ЛЕВЫЙ ВХОД или ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.чтобы получить 0, когда счет не найден (посмотрите на функции, такие как COALESCE) – Hector

+0

вы можете проверить нужный ответ ниже с полным демо-кодом код, который я написал, находится в oracle sql ... –

ответ

0

В таблице 1 у вас есть 2 ряда с [опера, 1]. В таблице 2 у вас есть 2 ряда с [1, 1].

2 * 2 = 4 

Так что, учитывая ваши данные, 4 является правильным, просто не то, что вы хотите.


Я хочу, чтобы узнать номер оперы, используемой в разное время.

Эта информация полностью содержится в таблице 2.

Select s2.time, count(s2.opera) 
From s2 
Group by s2.time 

(Если в момент времени 2, никто не использовать оперу, он должен иметь 0 там.)

Жесткий. У вас нет времени 2 в любой таблице, поэтому SQL не может знать, что вы этого хотите. (Думайте об этом, если это просто решило дать вам [2, 0], то почему бы и вам не дать вам [999999999, 0].)

+0

Спасибо! Это очень помогает! – Jessie

0

@jessie используйте приведенный ниже демо-код и запрос для вашего желаемый результат от Oracle SQL: -

create table sd1 (browser varchar2(10), time number) 

insert all into sd1 values('opera',1) 
into sd1 values('opera',1) 
into sd1 values('opera',3) 
into sd1 values('d',4) 
into sd1 values('d',5) 
into sd1 values('opera',6) 
into sd1 values('opera',7) 
into sd1 values('d',8) 
into sd1 values('opera',9) 
into sd1 values('opera',10) 
into sd1 values('d',11) 
into sd1 values('d',12) 
into sd1 values('d',13) 
into sd1 values('d',14) 
into sd1 values('opera',15) 
select * from dual; 

commit; 

create table sd2 (opera number, time number) 

insert all into sd2 values(1,1) 
into sd2 values(1,1) 
into sd2 values(1,3) 
into sd2 values(1,6) 
into sd2 values(1,7) 
into sd2 values(1,9) 
into sd2 values(1,10) 
select * from dual; 

commit; 

SELECT X.TIME ,COUNT(OPERA) OPERA_USED 
FROM 
(
    SELECT DISTINCT * FROM SD1 
    ORDER BY 2) X LEFT JOIN SD2 
    ON X.TIME=SD2.TIME 
    GROUP BY X.TIME 
ORDER BY 1; 

и ниже запрос даст вам все то время, которые не вставлены в заголовке SD1 таблицу т.е. вы сказали, что нужно время, 2 и против, к которой рассчитывать равную 0, хотя время 2 отсутствует в таблице sd1, результат зависит только от ваших данных.

select dha.time time,nvl(dh.opera_used,0) opera_used 
from 
    (
    select x.time ,count(opera) opera_used 
    from 
    (
     select distinct * from sd1 
     order by 2) x left join sd2 
     on x.time=sd2.time 
     group by x.time 
    )dh 
    right join 
    (
    select level time from 
     (
     select max(time) time from sd1 
     ) 
    connect by level<=time 
    ) dha 
    on dha.time=dh.time 
    order by 1;