从一个性别群体的平均工资较低但工作点数较高的人群中选择一个性别主导的群体

Posted

技术标签:

【中文标题】从一个性别群体的平均工资较低但工作点数较高的人群中选择一个性别主导的群体【英文标题】:Select a gender dominated group from a pupulation where one gendergroup has lower average salary but higher jobPoints 【发布时间】:2015-03-26 10:38:35 【问题描述】:

我有两个表:表一:列 – GroupName 和 GroupJobPoints。表二 在这里有这些感兴趣的列 – GroupName (fk_key)参考表一,Person_ID,性别,薪水。

我想从我的数据库中查看: 1) 获取以一种性别为主的 GroupName(=> 一种性别的 60 %)– 继续使用该组。 2) 比较这个以性别为主导的群体 GroupJobPoints。如果 GroupJobPoints 的差异在 4% 范围内 - 将男性组与女性组进行比较。 3) 比较男性群体的平均工资与女性群体在这 4% 范围内的平均工资。如果男性组的平均工资高于女性组 - 那么我想知道并显示它。

示例: 1) 第 1 组有 250 名男性和 50 名女性。第 2 组有 20 名男性和 300 名女性。两组都以性别为主,继续 2) 第 1 组有 2 000 分,第 2 组有 1 950 分。差异在 4% 范围内,一组由男性主导,一组由女性主导。继续。 3) 第 1 组的平均工资 = 25 000,第 2 组的平均工资 = 22 000。我希望显示这个,因为男性组的工作点数较低但平均工资较高,这对我来说有点奇怪:-)。

我如何通过 SQL 代码获取此信息。我使用 MS SQL-server Express 2012。我假设会有一些连接和 where 子句等等,并且代码将在某些方面逐步进行,但我不知道我将如何做到这一点。有人可以帮助我吗?我相信我会从中学到很多东西。

【问题讨论】:

学校工作?任何特定的dbms?你试过什么了?样本数据和预期输出? 这不是功课,而是作业,但无论如何谢谢。我所尝试的实际上什么都不是,因为我对 SQL YET 了解不多,但我正在学习并且正在努力学习。但是,如果我因此而被取消资格,那我会的。但我自己做了一个数据库,这对我来说是件大事。 样本数据——结构为表格——和期望的结果会有很大帮助。试图从第三段中弄清楚你想要做什么并不容易。 我有 46 个组,分数从 1 500 到 19 000 不等。所有的 gropus 都有不同大小的男性和女性。 4 % 的范围是滚动的,所以声明将是: 【参考方案1】:
with t1 as (
    select
        one.GroupName,
        one.GroupJobPoints,
        (select cast(count(1) as float) from TableTwo where GroupName=one.GroupName and Gender='M')/(select cast(count(1) as float) from TableTwo where GroupName=one.GroupName) FracMale,
        (select avg(Salary) from TableTwo where GroupName=one.GroupName) AvgSalary
    from
        TableOne one
)
select
    m.GroupName,
    m.GroupJobPoints,
    m.AvgSalary,
    m.FracMale,
    f.GroupName,
    f.GroupJobPoints,
    f.AvgSalary,
    f.FracMale
from
    t1 m
    cross join t1 f
where
    m.FracMale>=0.60
    and f.FracMale<=0.40
    and abs(f.GroupJobPoints-m.GroupJobPoints)/m.GroupJobPoints<=0.04
    and m.AvgSalary>f.AvgSalary
;

测试数据:

if object_id('TableTwo') is not null drop table TableTwo;
if object_id('TableOne') is not null drop table TableOne;
create table TableOne (GroupName varchar(32), GroupJobPoints float, primary key (GroupName) );
create table TableTwo (GroupName varchar(32) references TableOne(GroupName), Person_ID int, Gender char(1), Salary float, primary key (Person_ID) );

insert into TableOne (GroupName, GroupJobPoints ) values ('1',2000);
insert into TableOne (GroupName, GroupJobPoints ) values ('2',1950);

declare @PersonID int = 0;
declare @i int;

set @i = 0; while (@i < 250) begin set @PersonID=@PersonID+1; insert into TableTwo (GroupName, Person_ID, Gender, Salary ) values ('1',@PersonID,'M',25000); set @i=@i+1; end;
set @i = 0; while (@i < 50) begin set @PersonID=@PersonID+1; insert into TableTwo (GroupName, Person_ID, Gender, Salary ) values ('1',@PersonID,'F',25000); set @i=@i+1; end;

set @i = 0; while (@i < 20) begin set @PersonID=@PersonID+1; insert into TableTwo (GroupName, Person_ID, Gender, Salary ) values ('2',@PersonID,'M',22000); set @i=@i+1; end;
set @i = 0; while (@i < 300) begin set @PersonID=@PersonID+1; insert into TableTwo (GroupName, Person_ID, Gender, Salary ) values ('2',@PersonID,'F',22000); set @i=@i+1; end;

运行以上所有的输出:

【讨论】:

+1。很好的解决方案。建议将 f.FracMale 谢谢 我已经用我的数据测试了你的解决方案,我有一些问题。我如何在这里截屏给你看? 我在 SQL Fiddle 中尝试了您的代码,我收到一条消息,指出无效的对象名称表一。你能明白为什么sqlfiddle.com/#!6/9eecb/2202 见sqlfiddle.com/#!6/9eecb/2210。主要问题是您没有包含我编写的定义实际表(TableOneTableTwo)并将测试数据插入其中的测试代码。您还将select 查询中的别名从one 更改为Tableone,这无论如何都会导致它失败。最后一点,sqlfiddle 似乎在单独的批处理中执行每一行,并且由于 declare 语句仅在当前批处理中声明了一个变量,因此我必须将从第一个声明到最后一个 while 循环的所有语句合并到一行中。

以上是关于从一个性别群体的平均工资较低但工作点数较高的人群中选择一个性别主导的群体的主要内容,如果未能解决你的问题,请参考以下文章

Linux服务器CPU使用率较低但负载较高

奇妙的算法-条件排序

大小端

Tensorflow的官方MNIST模型具有较高的训练精度,但预测性能较低

在任何情况下,您更喜欢较高的大 O 时间复杂度算法而不是较低的时间复杂度算法?

各专业平均成绩较高的学生