2016-10-26 90 views
1
Department (dNumber, dName) 

Employee (SSN, eName, salary, /dNumber/) 

Project (pNumber, pName, pLocation) 

WorksOn (/SSN/, /pNumber/, hours) 

这些是我正在使用的表。我想列出超过5名员工工作的所有部门编号和姓名,并计算薪水超过40,000的员工人数。我想练习使用子查询。SQL使用子查询查询

这里是我写的:

SELECT T.dNumber, T.dName, COUNT(T.SSN) 
FROM 
(
SELECT d.dNumber, d.dName, e.SSN 
FROM Department d, Employee e 
WHERE e.salary > 40000 AND d.dNumber = e.dNo 
) as T 
GROUP BY dNumber, dName 
HAVING COUNT(T.SSN) > 5; 

但它的外观和感觉是多余的。这几乎就好像我不需要使用子查询。有任何想法吗?

谢谢!

+3

MySQL的<> SQL服务器 – FLICKER

+1

你查询只返回公司,超过5名员工获得4万以上的费用。但根据你的描述,你需要展示拥有5名以上员工的公司,并计算那些制作40k +的公司。哪一个是正确的? – Uriil

+0

@Uriil我的英语可能不好,但我有一种感觉,你说的是同样的事情。 –

回答

2

我想下面的查询将返回预期的结果(它是MySQL中,在MSSQL的情况下,你将需要与CASE条件更换IF):

SELECT T.dNumber, T.dName, COUNT(T.SSN) AS TotalEmployees, sum(IF(T.salary > 4000, 1, 0)) AS EmployeesOverFourty 
FROM Department d 
INNER JOIN Employee e ON d.dNumber = e.dNo 
GROUP BY dNumber, dName 
HAVING TotalEmployees > 5; 
0

SELECT 
    d1.dNumber, 
    d1.dName, 
    ISNULL (SUM (CASE WHEN e1.SSN IS NOT NULL THEN 1 ELSE 0 END), 0) AS EmployeeCount 
FROM 
(
    SELECT 
     Department.dNumber, 
     Department.dName 
    FROM 
     Employee 
    JOIN 
     Department 
    ON 
     Employee.dNumber = Department.dNumber 
    GROUP BY 
     Employee.dNumber 
    HAVING 
     COUNT(*) > 5 
) AS d 
LEFT JOIN 
    Employee e1 
ON 
    e1.dNumber = d1.dNumber AND 
    e1.Salary > 40000 
GROUP BY 
    d1.dNumber, 
    d1.dName