我是Oracle SQL的新用戶,並且具有下表。Oracle SQL - 訂單表
TABLE NAME : ORDERS
CNUM AMT SNUM
1001 1000 2001
1002 2000 2002
1001 1500 2001
1001 500 2001
需要得到的只有那些CNUM(客戶數量)超過3 SNUM(銷售人員)從該表中的服務數據
謝謝 了Asit
我是Oracle SQL的新用戶,並且具有下表。Oracle SQL - 訂單表
TABLE NAME : ORDERS
CNUM AMT SNUM
1001 1000 2001
1002 2000 2002
1001 1500 2001
1001 500 2001
需要得到的只有那些CNUM(客戶數量)超過3 SNUM(銷售人員)從該表中的服務數據
謝謝 了Asit
你可以使用分析功能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>
根據您的樣本數據,上述給出結果,包括3 SNUM爲CNUM,如果你想超過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:
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
謝謝all..but我只需要一個輸出,1001和2001年 – ash
我增加了我認爲你需要的東西。基本思想來自Rusty的回答。 –