現在我們有 3 個表,分別是員工、作業人員和專案。
對于員工表(帶有樣本資料)
| 員工ID | 姓名 | 性別 |
|---|---|---|
| 100 | 約翰 | 米 |
| 101 | 吉姆 | 米 |
| 102 | 山姆 | F |
| 103 | 奎因 | F |
| 400 | 簡 | F |
| 401 | 瑪麗 | F |
對于workson表,我們有
| 員工ID | 投影 |
|---|---|
| 101 | 4554 |
| 102 | 4554 |
| 103 | 4554 |
| 104 | 4554 |
| 101 | 4555 |
| 102 | 4555 |
| 401 | 4555 |
| 101 | 4556 |
| 102 | 4556 |
| 401 | 4556 |
對于專案表
| 投影 | 專案名 |
|---|---|
| 4556 | 僵尸 |
| 4555 | 傘公司 |
| 4554 | 邪惡 |
根據資料集,應該清楚的是,僅有 Jim 和 Sam 一起作業過 2 個以上專案的員工。因此,這應該是預期的結果,即 2。
然而,我自己的代碼似乎回傳了每個員工從事過的專案的數量,并檢索了 3000 行(每個員工)。當輸出應該只是一個簡單的整數。
SELECT COUNT(e.employeeid)
FROM employees e
JOIN workson w
ON e.employeeid = w.employeeid
GROUP BY e.employeeid
HAVING COUNT(w.projectid) > 9 ;
uj5u.com熱心網友回復:
您需要workson像這樣加入自身:
select e1.employeeid, e2.employeeid, count(e1.projectid) as worked_together
from workson as e1
join workson as e2 on e1.projectid = e2.projectid and e1.employeeid < e2.employeeid
group by e1.employeeid, e2.employeeid
order by worked_together desc
該<條件確保不包括行(Jim, Jim, Evil)和相反的對(Jim, Sam, Evil) <-> (Sam, Jim, Evil)。
結果包含成對的員工和他們一起作業的專案的數量。having添加一個子句很簡單。
| 員工ID | 員工ID | 一起作業 |
|---|---|---|
| 101 | 102 | 3 |
| 101 | 401 | 2 |
| 102 | 401 | 2 |
| 101 | 103 | 1 |
| 102 | 103 | 1 |
| 101 | 104 | 1 |
| 102 | 104 | 1 |
| 103 | 104 | 1 |
uj5u.com熱心網友回復:
您需要將表workson與自身連接:
with u as
(select w1.employeeid e1, w2.employeeid e2, count(*) ct
from workson w1 inner join workson w2
on w1.projectid = w2.projectid
and w1.employeeid < w2.employeeid
group by w1.employeeid, w2.employeeid
having count(*) > 2),
v as
(select distinct e1 from u union select distinct e2 from u)
select count(*) from v;
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/438125.html
上一篇:如何創建確定員工年齡分類的函式
