oraclesql-order表

oraclesql-order表,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我不熟悉Oracle SQL,下面有一个表 TABLE NAME : ORDERS CNUM AMT SNUM 1001 1000 2001 1002 2000 2002 1001 1500 2001 1001 500 2001 仅需要从上表中获取cnum(客户编号)由3名以上snum(销售人员)提供服务的数据 多谢各位 Asit您可以使用分析功能行数 比如说, SQL> WITH DATA AS( 2 SELECT

我不熟悉Oracle SQL,下面有一个表

TABLE NAME : ORDERS
CNUM     AMT    SNUM
1001     1000   2001
1002     2000   2002
1001     1500   2001
1001     500    2001
仅需要从上表中获取cnum(客户编号)由3名以上snum(销售人员)提供服务的数据

多谢各位
Asit

您可以使用分析功能行数

比如说,

SQL> WITH DATA AS(
  2  SELECT t.*, row_number() OVER(PARTITION BY cnum ORDER BY snum) rn FROM t
  3  )
  4  SELECT cnum, amt, snum FROM DATA
  5  WHERE rn >=3;

      CNUM        AMT       SNUM
---------- ---------- ----------
      1001       1500       2001

SQL>
根据您的样本数据,上面给出的结果包括cnum的3个snum,如果您想要超过3个,则将
=
替换为

WITH tab
     AS (SELECT 1001 CNUM, 1000 AMT, 2001 SNUM FROM DUAL
         UNION ALL
         SELECT 1002, 2000, 2002 FROM DUAL
         UNION ALL
         SELECT 1001, 1500, 2001 FROM DUAL
         UNION ALL
         SELECT 1001, 500, 2001 FROM DUAL)
  SELECT cnum
    FROM tab
GROUP BY cnum
  HAVING COUNT (*) >= 3;
如果您只需要cnum和snum,您可以执行以下操作,部分内容摘自Rusty的答案:

WITH tab
     AS (SELECT 1001 CNUM, 1000 AMT, 2001 SNUM FROM DUAL
         UNION ALL
         SELECT 1002, 2000, 2002 FROM DUAL
         UNION ALL
         SELECT 1001, 1500, 2001 FROM DUAL
         UNION ALL
         SELECT 1001, 500, 2001 FROM DUAL)
SELECT DISTINCT cnum, snum
  FROM (SELECT cnum, snum, COUNT (*) OVER (PARTITION BY cnum) RANK FROM tab)
 WHERE RANK >= 3;
像这样的

select cnum, count(*), sum(amount)  
  from orders
 group by cnum
having count(*) > 3
不确定您需要什么-聚合结果或每一行。如果您需要每一行,请尝试这一行:

select * from (
select a.*, count(*) over(partition by cnum) cnt  
  from orders a
) 
where  cnt > 3

您可以对不同的
SNUM
s进行分组和计数:

select CNUM 
from ORDERS
group by CNUM
having count(distinct SNUM) > 3

我已经添加了我认为您需要的内容。基本思想取自Rusty的答案。