SQL-有多少人获得最低和最高薪水?

时间:2018-11-18 15:48:51

标签: sql

我有一张包含员工,部门和薪水的表,我想获取每个部门的最低和最高薪水(按部门分组的最低/最高薪水),但如何计算多少员工收入每个部门的最低和最高薪水?

mToolbar = (Toolbar) findViewById(R.id.parents_login_toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setTitle("PARENTS LOGIN PAGE");

3 个答案:

答案 0 :(得分:2)

您需要将查询作为以下查询的子查询:

examples/sql_index_example/sql_index_example.cpp.1.o: In function `alexandria::data::hash::GetHash[abi:cxx11](std::vector<unsigned char, std::allocator<unsigned char> >)':
sql_index_example.cpp:(.text+0x197): undefined reference to `CryptoPP::StringSinkTemplate<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::StringSinkTemplate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

Rextester Demo

答案 1 :(得分:0)

对于每个部门的最低和最高薪水,您可能需要两个不同的值:

SELECT t1.Department, t1.MinCounter, t2.MaxCounter FROM
    (SELECT t.Department, COUNT(*) AS MinCounter 
    FROM 
        (SELECT Department, MIN(Salary) AS MinSalary FROM Employees
        GROUP BY Department) AS t 
    INNER JOIN Employees 
    ON (t.MinSalary = Employees.Salary) AND (t.Department = Employees.Department)
    GROUP BY t.Department) AS t1
INNER JOIN 
    (SELECT t.Department, COUNT(*) AS MaxCounter 
    FROM 
        (SELECT Department, MAX(Salary) AS MaxSalary FROM Employees
        GROUP BY Department) AS t 
    INNER JOIN Employees 
    ON (t.MaxSalary = Employees.Salary) AND (t.Department = Employees.Department)
    GROUP BY t.Department) AS t2
ON t1.Department = t2.Department

上面的查询由2个子查询组成,由Department连接,每个子查询获取每个部门的最低和最高薪水的计数器。

如果您还希望在查询中包括每个部门的最低和最高薪金,请检查以下内容:

SELECT t1.Department, t1.MinSalary, t1.MinCounter, t2.MaxSalary, t2.MaxCounter
FROM 
    (SELECT t.Department, t.MinSalary, COUNT(*) AS MinCounter 
    FROM (SELECT Department, MIN(Salary) AS MinSalary FROM Employees 
    GROUP BY Department)  AS t 
    INNER JOIN Employees 
    ON (t.Department = Employees.Department) 
    AND (t.MinSalary = Employees.Salary) 
    GROUP BY t.Department, MinSalary)  AS t1 
INNER JOIN 
    (SELECT t.Department, t.MaxSalary, COUNT(*) AS MaxCounter 
    FROM (SELECT Department, MAX(Salary) AS MaxSalary FROM Employees 
    GROUP BY Department)  AS t 
    INNER JOIN Employees 
    ON (t.Department = Employees.Department) 
    AND (t.MaxSalary = Employees.Salary) 
    GROUP BY t.Department, MaxSalary)  AS t2 
ON t1.Department = t2.Department

答案 2 :(得分:0)

您可以在子查询中获取最低和最高薪水,然后在外部查询中计算有多少员工拥有这些薪水,例如:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=b89ac6b76112bf7db65ce6e37754198b

select agg.*
, count(case when e.Salary = agg.MinSalary then 1 end) EmployeesWithMin
, count(case when e.Salary = agg.MaxSalary then 1 end) EmployeesWithMax
from
(
    select Department
    , count(1) EmployeesInDepartment
    , min(Salary) MinSalary
    , max(Salary) MaxSalary
    from Employees
    group by Department
) agg
inner join Employees e
on e.Department = agg.department
and e.Salary in (agg.MaxSalary, agg.MinSalary)
group by agg.Department
, agg.EmployeesInDepartment
, agg.MinSalary
, agg.MaxSalary

或另一种方法:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8a5e539fcd3e5985d44f86b1e331f030

select agg.Department
, min(agg.MinSalary) MinSalary
, max(agg.MaxSalary) MaxSalary
, count(case when Salary = MinSalary then 1 end) EmployeesWithMin
, count(case when Salary = MaxSalary then 1 end) EmployeesWithMax
from
(
    select Department
    , min(Salary) over (partition by Department) MinSalary
    , max(Salary) over (partition by Department) MaxSalary
    , Salary
    from Employees
) agg
group by agg.Department

对于初学者而言,前者可能更容易理解。后者不那么冗长,因此更易于阅读。也就是说,选择您更愿意支持的那个/对您来说最有意义的那个。

在性能方面,第二个样品的性能稍好一些;但是许多变量可能会影响这一点(行数,值的散布,索引的可用性),因此,如果需要选择最佳查询,最好对与真实世界相似的数据进行测试。

如果您不熟悉这里使用的任何方法,请告诉我。