Select 一个性别主导的群体来自一个群体,其中一个性别群体的平均工资较低但工作点数较高
Select a gender dominated group from a pupulation where one gendergroup has lower average salary but higher jobPoints
我有两个表:
Table 一个:列 – GroupName 和 GroupJobPoints。
Table two 此处有感兴趣的列 – GroupName (fk_key) 引用 Table One,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 子句等等,代码将在某些方面逐步进行,但我不知道我将如何做这个。谁能帮我解决这个问题,我相信我会从中学到很多东西。
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;
来自 运行 以上所有内容的输出:
我有两个表:
Table 一个:列 – GroupName 和 GroupJobPoints。
Table two 此处有感兴趣的列 – GroupName (fk_key) 引用 Table One,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 子句等等,代码将在某些方面逐步进行,但我不知道我将如何做这个。谁能帮我解决这个问题,我相信我会从中学到很多东西。
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;
来自 运行 以上所有内容的输出: