简体   繁体   中英

Write a query to display the names of the department and the staff count in each department, if staff not exist display the count as 0,

The code is running properly giving necessary output but one of the test cases fails.

select department_name,count(*) as staff_count 
from department d,staff s 
where d.department_id=s.staff_id 
group by department_name 
order by department_name;
Proposed grade: 50 / 100
 Result Description
 Failed Test
 Test Case 2

 Summary of tests
+------------------------------+
| 2 tests run / 1 test passed  |
+------------------------------+

qwe

Sample output with necessary input data:

DEPARTMENT_NAME                STAFF_COUNT                                      
------------------------------ -----------                                      
CSE                                      2                                      
ECE                                      1                                      
EEE                                      2                                      
IT                                       2                                      
SE                                       4                                      
DEPARTMENT_ID DEPARTMENT_NAME                DEPARTMENT_BLOCK_NUMBER            
------------- ------------------------------ -----------------------            
            1 CSE                                                  3            
            2 IT                                                   3            
            3 SE                                                   3            
            4 ECE                                                  2            
            5 EEE                                                  2            
  STAFF_ID STAFF_NAME                     DEPARTMENT_ID                         
---------- ------------------------------ -------------                         
         1 Lakshmi                                    1                         
         2 Venky                                      1                         
         3 Senthil                                    2                         
         4 Sandhya                                    2                         
         5 Geetha                                     3                         
         6 Tom                                        3                         
         7 Rekha                                      3                         
         8 Viji                                       3                         
         9 Laya                                       4                         
        10 Nisha                                      5                         
        11 Venki                                      5

You need an outer join for this, not an inner join (which your old and outdated implicit join in the WHERE clause does). You also need to do the join between the two department_id columns.

select department_name, count(s.staff_id) as staff_count 
from department d 
  left join staff s on d.department_id = s.department_id
group by department_name 
order by department_name;

The left join (=outer join) will return NUL for s.staff_id for departments that do not have staff. Aggregate functions simply ignore NULL values and that's how you get the 0 for the staff count.

However your sample data does not have any department without staff.

Online example with an additional empty department: https://rextester.com/EEXE2322

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM