
給定這樣的物體關系圖,我如何完成我在標題中輸入的任務?
我知道我需要創建一些子查詢(也許是相關的),但我無法完全理解這一點,因為課程中并沒有真正教授過這樣的例子。
我在互聯網上也找不到任何與此類似的示例,只有簡單的相關子查詢相關的東西(也許這個也很簡單,我只是無法注意到一些非常明顯的東西哈哈)
幫助將不勝感激,所以我可以得到一般的想法關于應該如何完成 :)
如果任務描述不明確 - emp 有“作業”欄位,其中包含“經理”、“職員”、“分析”等值,我們希望顯示哪個專案最有效從事這項作業的人。
作業 pname
經理 PROJ1
文員 PROJ3 分析員
PROJ2
uj5u.com熱心網友回復:
根據我對問題的解釋,您應該能夠使用聚合函式來獲取分配給作業的人數。您使用的查詢可能如下所示:
select projNo, count(empNo) 'Number of People on Job' from proj_emp group by projNo;
我在這個 SQL Fiddle 上創建了一個例子,你可以在這里找到。
如果您想顯示有關專案的更多詳細資訊,則只需進行簡單的表連接或類似操作
uj5u.com熱心網友回復:
據我所見, Job 應該被規范化為它自己的表(jobno,jobname),但考慮到你所擁有的,我認為類似下面的東西可能會起作用。
SELECT J.job, TP.pname, TP.emp_count
FROM (
SELECT DISTINCT E.job FROM emp E)
) J
CROSS APPLY (
SELECT TOP 1 P.pname, COUNT(*) AS emp_count
FROM emp E
JOIN proj_emp PE ON PE.empno = E.empno
JOIN proj P ON p.projno = PE.projno
WHERE E.job = J.job
GROUP BY P.pname
ORDER BY COUNT(*) DESC
) TP
如果您需要其他專案欄位,則需要將它們添加到選擇和 GROUP BY。
以上不計領帶,將任意選擇其中一個領帶專案。擴展 ORDER BY 可以減少這種隨意性。退回所有捆綁專案需要更多的作業。一種方法是讓一個 CROSS APPLY 計算MAX(COUNT(*))與給定作業相關聯的專案,第二個檢索專案資訊受HAVING COUNT(*) = previously_calculated_max.
使用視窗函式可能有更好的方法來做到這一點,但這不是我的專長。其他人可能有類似的建議。
附錄:這是一個使用視窗函式的查詢
SELECT A.job, A.pname, A.emp_count
FROM (
SELECT E.job, P.pname, COUNT(*) AS emp_count, MAX(COUNT(*)) OVER(PARTITION BY E.job) AS max_count
FROM proj P
JOIN proj_emp PE ON PE.projno = P.projno
JOIN emp E ON E.empno = PE.empno
GROUP BY E.job, P.pname
) A
WHERE A.emp_count = A.max_count;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422497.html
標籤:
