2014-12-06 58 views
1

我有兩個表:SQL:計數()和組由

塊引用 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 

塊引用 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,沒有人使用Opera,它應該有一個0那裏。)

塊引用

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 2014-12-06 08:46:41

+0

你可以檢查下面的所需答案完整的演示代碼我寫的代碼是在oracle sql ... – 2014-12-06 09:22:24

回答

0

在表1中,您有2行[opera,1]。 在表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 2014-12-06 09:01:49

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; 

及以下的查詢會給你所有的即你說你需要時間2和反對,其計數爲0,雖然未插入到你的頭SD1表時間時間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;