[英]Oracle SQL - Sum of distinct value belong year, for the first time
抱歉標題,但有點難以在一個單一行中解釋這個主題..
我有這樣一張桌子,我想知道(一年中的每個月)第一次獲得獎金的員工人數。
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
雙重聚合解決了您的問題:
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;
首先,對於每位員工,您會發現他/她獲得獎金的第一個月。 然后,您計算每個“收到的第一個獎金 - 收到的月份”的員工數量。
你也可以使用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
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.