![](/img/trans.png)
[英]Count distinct of a column based on 2 variables of another column in 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.