如何拿到会计部第二高的薪水?
How to get second highest Salary of Account Department?
我有如下三个表格 -:
Create table #temp (id int, DepartmentName varchar(50))
insert into #temp (id,DepartmentName) values(1,'Account')
insert into #temp (id,DepartmentName) values(2,'IT')
select * from #temp
Create Table #temp1(customerid int, CustomerName varchar(50),DepartmentId int)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(1,'Anil',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(2,'Ankit',2)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(3,'Mandeep',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(4,'Rajesh',2)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(5,'Rohit',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(6,'Sharma',0)
Create Table #temp2(customerid int, salary int)
insert into #temp2(customerid,salary)values(1,2000)
insert into #temp2(customerid,salary)values(3,2399)
insert into #temp2(customerid,salary)values(4,4000)
insert into #temp2(customerid,salary)values(2,4500)
insert into #temp2(customerid,salary)values(5,7000)
select max(t2.salary) ,t.CustomerName,t1.DepartmentName
from #temp1 t
left join #temp t1 on t1.id=t.DepartmentId
left join #temp2 t2 on t2.customerid=t.customerid
where DepartmentName='Account'
and salary<>(select max(tt2.salary) from #temp2 tt2
inner join #temp1 tt1 on tt1.customerid=tt2.customerid
inner join #temp tt on tt.id=tt1.DepartmentId
where tt.DepartmentName='Account')
group by CustomerName,DepartmentName
但是没有得到第二高的薪水,请任何人帮我解决这个问题,我在外部查询中使用了最大聚合函数,但仍然得到了客户部门的所有薪水。
使用Dense_Rank
SELECT
DepartmentName,
CustomerName,
salary
FROM
(
SELECT
t.DepartmentName,
DENSE_RANK() OVER( PARTITION BY id ORDER BY salary desc) rno,
salary,
t1.CustomerName
FROM #temp t
JOIN #temp1 t1
ON t.id = t1.DepartmentId
JOIN #temp2 t2
ON t1.customerid = t2.customerid
where t.DepartmentName='Account'
) a
WHERE rno = 2
更新
使用 dense_rank
修改了您的查询,因为我们无法使用客户名称进行分组。
SELECT salary,
CustomerName,
DepartmentName
FROM (SELECT t2.salary,
t.CustomerName,
t1.DepartmentName,
Dense_rank()
OVER(
partition BY DepartmentName
ORDER BY salary DESC) rno
FROM #temp1 t
LEFT JOIN #temp t1
ON t1.id = t.DepartmentId
LEFT JOIN #temp2 t2
ON t2.customerid = t.customerid
WHERE DepartmentName = 'Account'
AND salary NOT IN (SELECT Max(tt2.salary)
FROM #temp2 tt2
INNER JOIN #temp1 tt1
ON tt1.customerid = tt2.customerid
INNER JOIN #temp tt
ON tt.id = tt1.DepartmentId
WHERE tt.DepartmentName = 'Account'))a
WHERE rno = 1
试试这个:
SELECT #temp1.customerid,
CustomerName,
DepartmentName,
Max(salary)
FROM #temp
JOIN #temp1
ON id = DepartmentId
JOIN #temp2
ON #temp1.customerid = #temp2.customerid
WHERE id = 1
AND salary NOT IN (SELECT Max(salary)
FROM #temp2)
GROUP BY #temp1.customerid,
CustomerName,
DepartmentName
;WITH cte AS(
SELECT t1.customerid,t1.CustomerName,t2.DepartmentName FROM #temp1 t1
LEFT JOIN #temp t2 ON t1.DepartmentId = t2.id)
,cte2 as(
SELECT t3.*,t4.salary,ROW_NUMBER() OVER(ORDER BY t4.salary DESC) AS rno FROM cte t3
LEFT JOIN #temp2 t4 ON t3.customerid = t4.customerid)
SELECT * FROM cte2 WHERE rno=2
这是最简单、最快的方法。比使用排名更好...
select top 1
t1.Customerid,
t1.CustomerName,
t2.Salary,
t.DepartmentName
from #temp1 t1
Join #temp2 t2
on t2.customerId = t1.Customerid
Join #temp t
on t.id = t1.departmentid
and t.departmentName = 'account'
where t2.salary <
(
select MAX(t2.salary)
from #temp1 t1
Join #temp2 t2
on t2.customerId = t1.Customerid
Join #temp t
on t.id = t1.departmentid
and t.departmentName = 'account'
)
order by t2.salary desc
我也试试:)
with cte as
(
select
c.CustomerName,
d.DepartmentName,
s.Salary,
RowNumber = row_number() over (partition by c.DepartmentId order by s.Salary)
from
#temp1 c
inner join #temp d on d.Id = c.DepartmentId
inner join #temp2 s on s.CustomerId = c.CustomerId
)
select
CustomerName,
DepartmentName,
Salary
from
cte
where
RowNumber = 2
and
DepartmentName='Account';
已编辑:dance_rank
在这里更好。 Buddi 早先给了!
select t1.customerid,t2.salary,t1.CustomerName,t.DepartmentName
from #temp2 t2
join #temp1 t1
on t2.customerid=t1.customerid
join #temp t
on t1.DepartmentId =t.id
where salary=(
select MIN(salary) as salary from (select distinct top(2) salary from #temp2 order by salary desc )T)
试试上面的代码
我有如下三个表格 -:
Create table #temp (id int, DepartmentName varchar(50))
insert into #temp (id,DepartmentName) values(1,'Account')
insert into #temp (id,DepartmentName) values(2,'IT')
select * from #temp
Create Table #temp1(customerid int, CustomerName varchar(50),DepartmentId int)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(1,'Anil',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(2,'Ankit',2)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(3,'Mandeep',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(4,'Rajesh',2)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(5,'Rohit',1)
Insert into #temp1(customerid,CustomerName,DepartmentId)values(6,'Sharma',0)
Create Table #temp2(customerid int, salary int)
insert into #temp2(customerid,salary)values(1,2000)
insert into #temp2(customerid,salary)values(3,2399)
insert into #temp2(customerid,salary)values(4,4000)
insert into #temp2(customerid,salary)values(2,4500)
insert into #temp2(customerid,salary)values(5,7000)
select max(t2.salary) ,t.CustomerName,t1.DepartmentName
from #temp1 t
left join #temp t1 on t1.id=t.DepartmentId
left join #temp2 t2 on t2.customerid=t.customerid
where DepartmentName='Account'
and salary<>(select max(tt2.salary) from #temp2 tt2
inner join #temp1 tt1 on tt1.customerid=tt2.customerid
inner join #temp tt on tt.id=tt1.DepartmentId
where tt.DepartmentName='Account')
group by CustomerName,DepartmentName
但是没有得到第二高的薪水,请任何人帮我解决这个问题,我在外部查询中使用了最大聚合函数,但仍然得到了客户部门的所有薪水。
使用Dense_Rank
SELECT
DepartmentName,
CustomerName,
salary
FROM
(
SELECT
t.DepartmentName,
DENSE_RANK() OVER( PARTITION BY id ORDER BY salary desc) rno,
salary,
t1.CustomerName
FROM #temp t
JOIN #temp1 t1
ON t.id = t1.DepartmentId
JOIN #temp2 t2
ON t1.customerid = t2.customerid
where t.DepartmentName='Account'
) a
WHERE rno = 2
更新
使用 dense_rank
修改了您的查询,因为我们无法使用客户名称进行分组。
SELECT salary,
CustomerName,
DepartmentName
FROM (SELECT t2.salary,
t.CustomerName,
t1.DepartmentName,
Dense_rank()
OVER(
partition BY DepartmentName
ORDER BY salary DESC) rno
FROM #temp1 t
LEFT JOIN #temp t1
ON t1.id = t.DepartmentId
LEFT JOIN #temp2 t2
ON t2.customerid = t.customerid
WHERE DepartmentName = 'Account'
AND salary NOT IN (SELECT Max(tt2.salary)
FROM #temp2 tt2
INNER JOIN #temp1 tt1
ON tt1.customerid = tt2.customerid
INNER JOIN #temp tt
ON tt.id = tt1.DepartmentId
WHERE tt.DepartmentName = 'Account'))a
WHERE rno = 1
试试这个:
SELECT #temp1.customerid,
CustomerName,
DepartmentName,
Max(salary)
FROM #temp
JOIN #temp1
ON id = DepartmentId
JOIN #temp2
ON #temp1.customerid = #temp2.customerid
WHERE id = 1
AND salary NOT IN (SELECT Max(salary)
FROM #temp2)
GROUP BY #temp1.customerid,
CustomerName,
DepartmentName
;WITH cte AS(
SELECT t1.customerid,t1.CustomerName,t2.DepartmentName FROM #temp1 t1
LEFT JOIN #temp t2 ON t1.DepartmentId = t2.id)
,cte2 as(
SELECT t3.*,t4.salary,ROW_NUMBER() OVER(ORDER BY t4.salary DESC) AS rno FROM cte t3
LEFT JOIN #temp2 t4 ON t3.customerid = t4.customerid)
SELECT * FROM cte2 WHERE rno=2
这是最简单、最快的方法。比使用排名更好...
select top 1
t1.Customerid,
t1.CustomerName,
t2.Salary,
t.DepartmentName
from #temp1 t1
Join #temp2 t2
on t2.customerId = t1.Customerid
Join #temp t
on t.id = t1.departmentid
and t.departmentName = 'account'
where t2.salary <
(
select MAX(t2.salary)
from #temp1 t1
Join #temp2 t2
on t2.customerId = t1.Customerid
Join #temp t
on t.id = t1.departmentid
and t.departmentName = 'account'
)
order by t2.salary desc
我也试试:)
with cte as
(
select
c.CustomerName,
d.DepartmentName,
s.Salary,
RowNumber = row_number() over (partition by c.DepartmentId order by s.Salary)
from
#temp1 c
inner join #temp d on d.Id = c.DepartmentId
inner join #temp2 s on s.CustomerId = c.CustomerId
)
select
CustomerName,
DepartmentName,
Salary
from
cte
where
RowNumber = 2
and
DepartmentName='Account';
已编辑:dance_rank
在这里更好。 Buddi 早先给了
select t1.customerid,t2.salary,t1.CustomerName,t.DepartmentName
from #temp2 t2
join #temp1 t1
on t2.customerid=t1.customerid
join #temp t
on t1.DepartmentId =t.id
where salary=(
select MIN(salary) as salary from (select distinct top(2) salary from #temp2 order by salary desc )T)
试试上面的代码