SQL-使用特定列中的匹配值分割来自同一数据集的数据

SQL-使用特定列中的匹配值分割来自同一数据集的数据,sql,amazon-redshift,Sql,Amazon Redshift,我试图在数据集中找到符合特定标准的女性比例:公司id、工作类别、性别、时间范围、州id和州种类。为了做到这一点,我必须将符合该标准的女性总数除以符合该标准的男性和女性总数。 我目前正在查询数据,以找到“20号公司的女性,在工程领域,从任何时候起,种类和id=0,并将其除以满足该标准的男性和女性总数: /* number of females in eng. jobs */ (SELECT 1.0*sum(hiring_sample_count) FROM metrics m JOIN cate

我试图在数据集中找到符合特定标准的女性比例:公司id、工作类别、性别、时间范围、州id和州种类。为了做到这一点,我必须将符合该标准的女性总数除以符合该标准的男性和女性总数。 我目前正在查询数据,以找到“20号公司的女性,在工程领域,从任何时候起,种类和id=0,并将其除以满足该标准的男性和女性总数:

/* number of females in eng. jobs */
(SELECT 1.0*sum(hiring_sample_count) 
FROM metrics m
JOIN category c ON
m.job_id = c.job_id
AND m.company_id = 20
AND c.standard_job_cat = 'Engineering'
AND dimension_value = 'Female'
AND time_frame = 'ALLTIME'
AND state_kind = 0
AND state_item_id =0) /
/* number of m+f in eng */
(SELECT sum(hiring_sample_count) 
FROM metrics m
JOIN category c ON
m.job_id = c.job_id
AND m.company_id = 20
AND c.standard_job_cat = 'Engineering'
AND (dimension_value = 'Female' 
  OR dimension_value = 'Male')
AND time_frame = 'ALLTIME'
AND state_kind = 0
AND state_item_id =0))
问题是,我想对数据集中所有工作类别、种类和ID的所有公司进行计算。我不知道如何在没有具体说明的情况下做到这一点,我想知道是否有人可以帮忙。我正在使用SQLWorkbench,它是一个独立于DBMS的跨平台SQL查询工具。我希望能得到一些帮助(我不使用TSQL或PL/pgSQL)


对格式也表示歉意

只需使用条件聚合:

SELECT AVG(CASE WHEN dimension_value = 'Female' THEN 1.0 ELSE 0.0 END) as female_proportion
FROM metrics m JOIN
     category c
     ON m.job_id = c.job_id
WHERE m.company_id = 20 AND
      c.standard_job_cat = 'Engineering' AND
      time_frame = 'ALLTIME' AND
      state_kind = 0 AND
      state_item_id = 0;
SELECT
 m.company_id
,c.standard_job_cat
,time_frame
,state_kind
,state_item_id
,sum(case when dimension_value = 'Female' then hiring_sample_count else 0 end) as females
,sum(hiring_sample_count) as total
,1.0*sum(case when dimension_value = 'Female' then hiring_sample_count else 0 end)/sum(hiring_sample_count) as female_proportion
FROM metrics m
JOIN category c 
ON m.job_id = c.job_id
GROUP BY 1,2,3,4,5
ORDER BY 1,2,3,4,5;

你需要根据你想要确定女性百分比的列列表进行分组,它将单独生成计数。计数本身由条件聚合产生:

SELECT AVG(CASE WHEN dimension_value = 'Female' THEN 1.0 ELSE 0.0 END) as female_proportion
FROM metrics m JOIN
     category c
     ON m.job_id = c.job_id
WHERE m.company_id = 20 AND
      c.standard_job_cat = 'Engineering' AND
      time_frame = 'ALLTIME' AND
      state_kind = 0 AND
      state_item_id = 0;
SELECT
 m.company_id
,c.standard_job_cat
,time_frame
,state_kind
,state_item_id
,sum(case when dimension_value = 'Female' then hiring_sample_count else 0 end) as females
,sum(hiring_sample_count) as total
,1.0*sum(case when dimension_value = 'Female' then hiring_sample_count else 0 end)/sum(hiring_sample_count) as female_proportion
FROM metrics m
JOIN category c 
ON m.job_id = c.job_id
GROUP BY 1,2,3,4,5
ORDER BY 1,2,3,4,5;
添加了
1.0*
以避免整数除法,而
女性
总计
列仅用于感知上下文