SQL Query用于标识位于多个站点的客户

时间:2015-12-16 11:37:30

标签: sql oracle

我在这里遇到一些SQL查询问题。我想选择多个网站中的客户示例 peter>> site1 peter>> site2 peter site3 请我尝试了很多查询,但我的事情不正确我需要更合乎逻辑的东西在oracle sql plus中。

SQL> select * from HHCCUSTOMERS;

   OID O_CNAME           CID O_SITE  O_BOOKDAT    DEPOSIT    PAYMENT
  1220 tess              120 site3   10-DEC-15        500       1500
  1240 hilda             140 site3   30-JAN-16        300       1500
  1250 isla              150 site2   04-JAN-16        750       1000
  1260 hilda             160 site1   05-FEB-16        800       2000
  1280 maija             180 site3   20-NOV-15        650       1500
  1290 iris              190 site3   10-DEC-15        600       1500
  1200 tess              120 site3   10-DEC-15        500       1500
  1202 hilda             140 site2   30-JAN-16        300       1500
  1203 louise            130 site1   20-NOV-15        600       1000

选择了9行。 我使用了此查询

 select o_cname,oid,o_site,c_type,c_facility
      from HHCCUSTOMERS
      inner join HHCPARK
      on HHCPARK.cid=HHCCUSTOMERS.cid
      where o_cname='louise' or o_cname='hilda';

O_CNAME           OID O_SITE  C_TYPE     C_FACILITY
---------- ---------- ------- ---------- ----------
louise           1203 site1   bronze     semifurnis
hilda            1240 site3   silver     digitalvan
hilda            1202 site3   silver     digitalvan
hilda            1260 site1   gold       customize

3 个答案:

答案 0 :(得分:2)

如果您想要客户,那么您可以这样做:

select c.o_cname
from hhcustomers c
group by c.o_cname
having min(o_site) <> max(o_site);

另一种选择是:

having count(distinct o_site) > 1

count(distinct)会产生额外的开销,因此min() / max()通常会有更好的效果。

如果您需要详细信息,那么一种方法就是分析函数:

select c.*
from (select c.*,
             count(distinct o_site) over (partition by o_cname) as numsites
      from hhcustomers c
     ) c
where numsites > 1;

或者,没有直接统计网站的替代方法使用exists

select c.*
from hhcustomers c
where exists (select 1
              from hhcustomers c2
              where c2.o_cname = c.o_cname and c2.o_site <> c.o_site
             );

答案 1 :(得分:0)

这听起来好像要使用count(.)group by;

之类的东西
SELECT O_CNAME, COUNT(O_SITE) AS C FROM HHCCUSTOMERS WHERE C > 1 GROUP BY O_CNAME

注意:没有检查此查询。

答案 2 :(得分:0)

尝试这种方式:

select o_cname, count(*)
  from HHCCUSTOMERS
       inner join HHCPARK
           on HHCPARK.cid=HHCCUSTOMERS.cid
  where o_cname='louise' or o_cname='hilda'
  GROUP BY o_cname
  HAVING count(*)>1;

如果你离开where子句,它会检查louisehilda,如果你把它放在哪里,它会显示同时位于多个地方的每个人。