Shamelessly taking @harishgg1 good work in creating the dummy data....
if this is not what you need, please adapt the table creation and data population to your situation and based on the populated data, what your expected output should be
USE tempdb
GO
set nocount ON
go
drop table IF EXISTS employeemaster
go
drop table IF EXISTS employeecategory
go
drop table IF EXISTS employeelocation
go
create table employeemaster
(
empcategoryid int ,
emplocationid int
)
create table employeecategory
(
empcategoryid int ,
empcategoryname varchar(100)
)
insert into employeecategory select 1,'SystemAdmin'
insert into employeecategory select 2,'WindowsAdmin'
insert into employeecategory select 3,'Supervisor'
insert into employeecategory select 3,'ContractWorker'
create table employeelocation
(
emplocationid int,
emplocationname varchar(100)
)
insert into employeelocation select 1 ,'Kiev'
insert into employeelocation select 2 ,'Moscow'
insert into employeelocation select 3 ,'Amsterdam'
insert into employeemaster select 1,1
insert into employeemaster select 1,1
insert into employeemaster select 1,1
insert into employeemaster select 1,2
insert into employeemaster select 1,2
insert into employeemaster select 1,2
insert into employeemaster select 1,2
insert into employeemaster select 1,2
insert into employeemaster select 2,1
insert into employeemaster select 3,1
insert into employeemaster select 4,1
insert into employeemaster select 5,1
insert into employeemaster select 6,1
insert into employeemaster select 7,1
insert into employeemaster select 1,2
insert into employeemaster select 2,2
insert into employeemaster select 3,2
insert into employeemaster select 4,2
insert into employeemaster select 5,2
insert into employeemaster select 6,2
insert into employeemaster select 7,2
insert into employeemaster select 3,1
insert into employeemaster select 3,1
insert into employeemaster select 1,3
insert into employeemaster select 1,3
insert into employeemaster select 1,3
go
-- SET STATISTICS IO, TIME ON
--select * from employeemaster go
--select * from employeecategory go
--select * from employeelocation go
/*
one way to get what you want
*/
; with headers as (
select * from employeecategory
cross join employeelocation
)
select emplocationname, empcategoryname, counts.total
from headers
cross apply (
select count(*) as total
from employeemaster
where emplocationid = headers.emplocationid
and empcategoryid = headers.empcategoryid
) as counts
ORDER BY emplocationname, empcategoryname
/*
an alternative
*/
select el.emplocationname, ec.empcategoryname, count(em.empcategoryid) from employeecategory ec
cross join employeelocation el
LEFT OUTER JOIN employeemaster em
on ec.empcategoryid = em.empcategoryid
and el.emplocationid = em.emplocationid
group by el.emplocationname, ec.empcategoryname
ORDER BY el.emplocationname, ec.empcategoryname