2015-06-03 110 views
0

我是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

回答

0

你可以使用分析功能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個,然後用>替換>=

0
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; 
+0

謝謝all..but我只需要一個輸出,1001和2001年 – ash

+0

我增加了我認爲你需要的東西。基本思想來自Rusty的回答。 –

2

類似的東西?

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 
0

您可以將和計數不同SNUM S:

+0

謝謝大家.. – ash