You can rewrite the query using correlated sub-queries:
SQL Fiddle
Oracle 11g R2 Schema Setup:
CREATE TABLE STAFF ( StaffID NUMBER, Name VARCHAR2(50), BranchID NUMBER );
CREATE TABLE BRANCH ( BranchID NUMBER, Name VARCHAR2(50) );
CREATE TABLE RENTAL ( StaffID NUMBER );
CREATE TABLE MEMBER_REGISTRATION ( StaffID NUMBER );
INSERT INTO STAFF VALUES ( 1, 'Alice', 1 );
INSERT INTO STAFF VALUES ( 2, 'Bob', 2 );
INSERT INTO STAFF VALUES ( 3, 'Carol', 1 );
INSERT INTO STAFF VALUES ( 4, 'Dave', 2 );
INSERT INTO BRANCH VALUES ( 1, 'Branch A' );
INSERT INTO BRANCH VALUES ( 2, 'Branch B' );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 1 );
INSERT INTO RENTAL VALUES ( 2 );
INSERT INTO RENTAL VALUES ( 2 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 1 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
INSERT INTO MEMBER_REGISTRATION VALUES ( 3 );
Query 1:
SELECT s.StaffID,
s.Name,
b.Name AS branch_name,
( SELECT COUNT(r.StaffID)
FROM RENTAL r
WHERE r.StaffID = s.StaffID ) AS rental_count,
( SELECT COUNT(m.StaffID)
FROM MEMBER_REGISTRATION m
WHERE m.StaffID = s.StaffID ) AS member_regestration_count
FROM STAFF s
INNER JOIN BRANCH b
ON s.BranchID = b.BranchID
Results:
| STAFFID | NAME | BRANCH_NAME | RENTAL_COUNT | MEMBER_REGESTRATION_COUNT |
|---------|-------|-------------|--------------|---------------------------|
| 1 | Alice | Branch A | 4 | 3 |
| 2 | Bob | Branch B | 2 | 0 |
| 3 | Carol | Branch A | 0 | 3 |
| 4 | Dave | Branch B | 0 | 0 |
Edit 1: Removed COALESCE() as its not necessary.
Edit 2: Added column alias for BRANCH.name as there were two columns named "name".