[英]Oracle SQL - order table
我是Oracle SQL的新手,下面有一张表格。
TABLE NAME : ORDERS
CNUM AMT SNUM
1001 1000 2001
1002 2000 2002
1001 1500 2001
1001 500 2001
仅需要从上表中获取cnum(客户编号)由3 snum(销售人员)提供服务的那些数据
谢谢你阿西特
这样的东西?
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
您可以使用分析功能ROW_NUMBER 。
例如,
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;
您可以对不同的SNUM
进行分组和计数:
select CNUM
from ORDERS
group by CNUM
having count(distinct SNUM) > 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.