【问题标题】:Get top 3 salaries columnwise department wise in employee table?在员工表中获得前 3 名的工资列部门明智?
【发布时间】:2016-11-16 05:36:36
【问题描述】:

有 2 张桌子:-
Employee 表包含所有员工。

+----+-------+--------+--------------+  
| Id | Name  | Sa1ary | DepartmentId |   
+----+-------+--------+--------------+  
|  1 | Joe   |  70000 |            1 |  
|  2 | Henry |  80000 |            2 |  
|  3 | Sam   |  60000 |            2 |  
|  4 | Max   |  90000 |            3 |  
|  5 | Janet |  69000 |            4 |  
|  6 | Randy |  85000 |            1 |  
+----+-------+--------+--------------+  

部门表如下:-

+----+------------+      
|DID |  DNAME     |   
+----+------------+  
|1   |  IT        |  
|2   |  ADMIN     |  
|3   |  HR        |  
|4   |  MARKETING |  
|5   |  SALES     |  
+----+------------+   

输出应该是:-

+-----+--------+--------+------+------+  
|Dname| Best    |Seond best |  Worst |  
+-----+--------+--------+------+------+  
|IT   |  40000  |30000  |10000        |  
+-----+--------+--------+------+------+    
|ADMIN| 50000   |   |50000        |   
+-----+--------+--------+------+------+  
|HR   | 70000   |60000  |60000        |   
+-----+--------+--------+------+------+  

我们必须考虑每个部门的最高工资、第二最高工资和 3 最高工资。

【问题讨论】:

  • 您使用的是哪个数据库?
  • 给定的输出似乎与给定的输入表不一致。你能检查一下吗?另外,“最好最差”的标准是什么?柱子?第三好?如果一个部门只有一名员工。输出中的最佳和“最佳最差”是否预计相同,或者“最佳最差”列预计为空?请更新详细信息是问题。
  • 可以使用mysql作为数据库。

标签: sql select join subquery


【解决方案1】:

在 SQL Server 上,您可以使用 SQL Row_Number function with Partition By 子句根据基于所选列的组中的值对行进行排名

我还使用了 CTE 表达式和 GROUP By 运算符

;with cte as (
select 
    Dname, Sa1ary, ROW_NUMBER() Over (Partition By d.DId Order By Sa1ary desc) rn
from employee e
inner join department d on e.DepartmentId = d.DId
)
select
    dname,
    max(Best) Best,
    max(Seond) Seond,
    max("Best Worst") "Best Worst"
from (
select
    Dname,
    case when rn = 1 then Sa1ary else null end as Best,
    case when rn = 2 then Sa1ary else null end as Seond,
    case when rn = 3 then Sa1ary else null end as "Best Worst"
from cte
) t
group by dname

请注意,结果与您显示的不一样,我猜那里有错误。

请测试以上内容,希望对您有所帮助,

【讨论】:

  • 感谢您的解决方案..它真的很有帮助
【解决方案2】:

试试下面的透视查询。

            select * from 
            (
            select DName,salary,Class from
            (
            select 
            *,
            case when RID='1' then 'Best'
            when RID='2' then 'second'
            when RID='3' then 'Best Worst'
            else
            NULL
            end as CLASS
            from (
            select DID,Dname,salary ,     
            ROW_NUMBER() OVER ( PARTITION  BY Dname ,DID
            ORDER BY salary DESC  ) as RID
             from
             #Employee E inner join  #Department D on E.DepartmentId=d.DID
             )a
            where rid <4
            )b   
            ) as x
            pivot(
            max(salary) for class in ( [Best],[Second],[Best Worst]) 
            )
            as pivot1

【讨论】:

    【解决方案3】:
    CREATE TABLE #Table1(Id INT, Name VARCHAR(100), Salary INT, DepartmentId INT)
    CREATE TABLE #Table2(DID INT, DNAME VARCHAR(100))
    
    INSERT INTO #Table1(Id , Name , Salary , DepartmentId )
    SELECT 1,'Joe',70000,1 UNION ALL
    SELECT 2,'Henry',80000,2 UNION ALL
    SELECT 3,'Sam',60000,2 UNION ALL  
    SELECT 4,'Max',90000,3 UNION ALL
    SELECT 5,'Janet',69000,4 UNION ALL  
    SELECT 6,'Randy',85000,1 
    
    INSERT INTO #Table2(DID , DNAME)
    SELECT 1,'IT' UNION ALL
    SELECT 2,'ADMIN' UNION ALL
    SELECT 3,'HR' UNION ALL
    SELECT 4,'MARKETING' UNION ALL
    SELECT 5,'SALES'  
    
    ;WITH CTE AS
    (
     SELECT *,(SELECT COUNT(*) FROM #Table1 WHERE e.salary <= salary AND  departmentID=e.departmentID) AS RowNo FROM #Table1 e
    )
    SELECT * 
    FROM 
    ( 
    SELECT DNAME,salary,CASE WHEN RowNo = 1 THEN 'Best' WHEN RowNo  = 2 THEN 'Seond' WHEN RowNo = 3 THEN 'Best Worst' END RowNo
     FROM CTE 
     JOIN #Table2 ON DID = DepartmentId
     WHERE RowNo <= 3
     )A
    PIVOT
    (
      MAX(salary) FOR RowNo IN ([Best],[Seond],[Best Worst])
    ) PVT 
    
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2023-03-22
    • 2013-05-23
    • 2012-08-02
    • 2021-09-09
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多