簡體   English   中英

Oracle SQL - 獨特值的總和屬於年份,這是第一次

[英]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

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

雙重聚合解決了您的問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM