2015-11-06 35 views
1

遺憾的冠軍,但有點難以解釋在連續事務所的話題..的Oracle SQL - 獨特的價值屬於一年的總和,首次

我有一個這樣的表,我想知道(每年的每個月)第一次獲得獎金的員工人數。

EMPLOYEE_NAME MONTH BONUS_RECEIVED 
AAA     1    1 
BBB     1    1 

CCC     2    1 
AAA     2    1 
DDD     2    1 

AAA     3    1 
BBB     3    1 
XXX     3    1 

所以,結果應該是

MONTH  TOTAL_BONUS 
1      2 
2      2 
3      1 
  • 月1,僱員AAA和BBB接收獎金(所以結果是2)

  • 第2個月,僱員CCC和DD收到獎金(AAA已經收到全年),所以結果是2

  • 第3個月,只有員工XXX h爲獲得獎金,因爲AAA和BBB已經收到它在全年的

回答

0

您可以使用ROW_NUMBER()解析函數。

例如,

設置

CREATE TABLE t 
    (EMPLOYEE_NAME varchar2(3), MONTH number, BONUS_RECEIVED number); 

INSERT ALL 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('AAA', 1, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('BBB', 1, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('CCC', 2, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('AAA', 2, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('DDD', 2, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('AAA', 3, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('BBB', 3, 1) 
    INTO t (EMPLOYEE_NAME, MONTH, BONUS_RECEIVED) 
     VALUES ('XXX', 3, 1) 
SELECT * FROM dual; 

查詢

SQL> SELECT MONTH, 
    2 COUNT(rn) total_bonus 
    3 FROM 
    4 (SELECT t.*, 
    5  row_number() OVER(PARTITION BY employee_name ORDER BY MONTH) rn 
    6 FROM t 
    7 WHERE BONUS_RECEIVED = 1 
    8 ) 
    9 WHERE rn = 1 
10 GROUP BY MONTH; 

    MONTH TOTAL_BONUS 
---------- ----------- 
     1   2 
     2   2 
     3   1 
+0

非常感謝您的回覆!我試圖使用分析功能......但有時候有點難以理解.. – Mistre83

+0

@ Mistre83不客氣!沒問題,只練習幾次,你就會習慣它:-) –

+0

downvote的任何理由?我認爲這完全回答OP的問題。如果爲downvote提供了一個原因,我將不勝感激,以便我們能夠理解原因。 –

2

雙聚合解決您的問題:

select month, count(1) as total_bonus 
from (
    select employee_name, min(month) as month 
    from table_like_this 
    where bonus_received = 1 
    group by employee_name 
) 
group by month; 

首先,爲每個員工找到他/她收到的第一個月獎金。然後,您計算每個「找到的第一個獎金收到月份」的員工數量。

1

U可以也使用RANK()

SELECT MONTH 
     ,COUNT(BONUS) AS BONUS 
    FROM (
     SELECT EMPLOYEE 
      ,MONTH 
      ,BONUS 
      ,RANK() OVER (
       PARTITION BY EMPLOYEE ORDER BY MONTH 
       ) AS RN 
     FROM TBTEST 
     ) 
    WHERE RN = 1 
    GROUP BY MONTH