SQL:count()和group by

时间:2014-12-06 08:42:24

标签: 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个。我不知道哪里出了问题。

2 个答案:

答案 0 :(得分:0)

在表1中,您有2行[opera,1]。 在表2中,您有2行[1,1]。

2 * 2 = 4

因此,根据您的数据,4是正确的,而不是您想要的。


  

我想找出不同时间使用的歌剧数量。

该信息完全包含在表2中。

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

  

(如果在时间2,没有人使用opera,那么它应该为0。)

硬。你不会在任何一个表中都有时间2,所以SQL无法知道你想要它。 (考虑一下。如果它只是决定给你[2,0],那么为什么它也不会给你[999999999,0]。)

答案 1 :(得分: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;