簡體   English   中英

基於sql中另一列的列中的不同計數

[英]Distinct count in a column based on another column in sql

我有一個包含兩列的employee表:emp_id和month_of_project。 我想找出特定月份參與項目的員工人數。 意思是如果同一個人在3個月內參與,我們將只計算第一個月的那個人。 我在下面提到過示例

emp_id       month_of_project
101           Jan
102           Jan
103           Jan
101           Feb
104           Mar
102           Mar
105           Apr
103           Apr

結果應該是

month    count
Jan     3
Feb     0
Mar     1
Apr     1  

有沒有辦法在sql中實現這一點?

我認為你只應該使用GROUP BY子句

SELECT month_of_project, COUNT(emp_id)
FROM employees
GROUP BY month_of_project

您可以使用NOT EXISTS僅獲取上個月沒有記錄的記錄。 太糟糕了,你選擇了一個月的文字表示,而不是數字表示。 所以你首先要把它翻譯成數字。 您可以在此處使用CASE表達式。

SELECT t1.month_of_project,
       count(*)
       FROM elbat t1
       WHERE NOT EXISTS (SELECT *
                                FROM elbat t2
                                WHERE CASE t2.month_of_project
                                        WHEN 'Jan' THEN
                                          1
                                        ...
                                        WHEN 'Dec' THEN
                                          12
                                      END
                                      <
                                      CASE t1.month_of_project
                                        WHEN 'Jan' THEN
                                          1
                                        ...
                                        WHEN 'Dec' THEN
                                          12
                                      END
                                      AND t2.emp_id = t1.emp_id)
       GROUP BY t1.month_of_project;

sql用於oracle。 請不要在你的真實系統中存儲這樣的月份。 使用日期字段。 如果您的用例只是一個月,則年份可以是任意的,如2000年,而日期可以是01但是atleaset用於排序等具有真實日期始終始終是正確的想法。

首先是模擬數據。 部分mons中的第二個是獲得可能的月份列表,因為你想要2月份的0。如果你在外面有那個表,你不需要那個。

然后基本上內部查詢查找員工的第一個月作為使用月份和外部查詢計數不同

with emp_mon as 
(
              select '101' emp_id, to_date('20190101','YYYYMMDD') month_of_project from dual 
    union all select '102', to_date('20190101','YYYYMMDD') from dual 
    union all select '103', to_date('20190101','YYYYMMDD') from dual 
    union all select '101', to_date('20190201','YYYYMMDD') from dual 
    union all select '104', to_date('20190301','YYYYMMDD') from dual 
    union all select '102', to_date('20190301','YYYYMMDD') from dual 
    union all select '105', to_date('20190401','YYYYMMDD') from dual 
    union all select '103', to_date('20190401','YYYYMMDD') from dual 
),
mons as
(
    select distinct month_of_project
    from  emp_mon
)
select mons.month_of_project, count(distinct emp_first_mon.emp_id) cnt_emp_id
from mons
     left outer join
     (
         select emp_id, min(month_of_project) month_of_project
         from emp_mon
         group by emp_id
     ) emp_first_mon on emp_first_mon.month_of_project = mons.month_of_project
group by mons.month_of_project
order by 1

SQL Sever COUNT DISTINCT將完全按照您的要求執行操作。 但是,在正確的列上進行分組很重要。

WITH TEMP AS
(
SELECT 1 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 2 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 2 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 3 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 1 AS EMP, 2 AS MONTH_D

)

SELECT MONTH_D, COUNT(DISTINCT EMP) FROM TEMP
GROUP BY MONTH_D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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