oraclesql-order表
我不熟悉Oracle SQL,下面有一个表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
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的答案。