Interview Question
Country: United States
Interview Type: Phone Interview
This query wasn't giving me the right results. i have modified it in the following way
SELECT SUM(EMP_SAL) AS COUNT_SAL
FROM Employee_Test
WHERE EMP_NAME IN
(
SELECT TT2.Emp_name --,TT2.Emp_Sal
FROM Employee_Test AS tt1
RIGHT OUTER JOIN Employee_Test AS tt2 ON tt1.[Emp_Name]=tt2.[Manager]
WHERE tt1.[Emp_Name] is NULL )
Use union-find data structure to solve this problem.
get_parent(manager){
if parent[manager] != manager
m = get_parent(manager)
parent[manager] = m
return m
else
return manager
}
get_total(){
for e in (Emp and Manager):
parent[e] = e
total[e] = 0
for each (Emp Manager Salary ) record:{
p = get_parent(Manager)
parent[Emp] = p
total[p] += Salary
}
for p in parent:
if parent[p] <> p:
print p, total[p]
}
correcting
get_parent(manager){
if parent[manager] != manager
m = get_parent( parent[[manager])
parent[manager] = m
return m
else
return manager
}
SELECT E2.ENAME,
(SELECT SUM(e1.SAL)
FROM EMP1 E1
START WITH E1.EMPNO = e2.empno
CONNECT BY PRIOR e1.empno = e1.mgr
)sum_sal
FROM EMP1 E2
WHERE LEVEL =1
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO =MGR;
create table t1(
emp int,
mang int,
sal int)
insert into t1 values (1,null,100)
insert into t1 values (2,1,90)
insert into t1 values (3,1,90)
insert into t1 values (4,2,80)
insert into t1 values (5,3,80)
insert into t1 values (6,2,80)
insert into t1 values (7,3,80)
insert into t1 values (8,4,70)
insert into t1 values (9,5,70)
insert into t1 values (10,6,70)
insert into t1 values (11,7,70)
with temp1(emp,mang,sal,level) as (
select a.emp,a.mang,a.sal,1
from t1 a
where a.mang is null
union all
select a.emp,a.mang,a.sal,level+1
from t1 a
join temp1 b on a.mang = b.emp
)
select distinct level,(select sum(sal) from temp1 b where a.level <= b.level) from temp1 a
where level in (1,2)
;with t1 (employeeID, manager_EID, salary) as(
select e1.employeeID, e1.employeeID, e1.salary
from employee_manager_tbl e1
where e1.manager_EID is null
UNION ALL
select e3.employeeID, t1.manager_EID, e3.salary
from employee_manager_tbl e3 inner join t1
on e3.manager_EID=t1.employeeID)
select manager_EID, SUM(salary)
from t1
group by manager_EID
order by manager_EID
SQLServer:
- EchoJi May 14, 2013WITH T1(Emp,Manager,Salary) AS
(
SELECT tt2.[Emp],tt2.[Manager],tt2.[Salary]
FROM [YourTable] AS tt1
RIGHT OUTER JOIN [YourTable] AS tt2 ON tt1.[Emp]=tt2.[Manager]
WHERE tt1.[Emp] is NULL
UNION ALL
SELECT r.[Emp],T1.[Manager],r.[Salary]
FROM [YourTable] AS r
INNER JOIN T1 ON r.[Manager]=T1.[Emp]
)
SELECT [Manager],SUM([Salary]) AS Salary
FROM T1
GROUP BY [Manager]
ORDER BY SUM([Salary]) DESC