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

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

Project (pNumber, pName, pLocation) 

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

これらは私が処理しているテーブルです。私は、5人以上の従業員が働いている部門番号と名前をすべて列挙し、給与が4万人を超える従業員の数を数えたいと思います。サブクエリを使って練習したい。サブクエリを使用した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人以上の従業員が40k +を取得します。しかし、あなたの説明によれば、5人以上の従業員を持つ企業を展示し、40k +を作った人を数える必要があります。どちらが正しいか? – Uriil

+0

@Uriil私の英語は悪いかもしれませんが、同じことを言っている気がします。 –

答えて

2

は、私は、クエリが返すの下に、あなたが(それはあなたがCASE条件でIFを交換する必要がありますMSSQLの場合には、MySQLのだ)結果を期待思う:

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 
関連する問題