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

时间:2017-07-08 00:10:18

标签: sql amazon-redshift

我正在尝试在符合特定条件的数据集中找到女性的比例:公司ID,工作类别,性别,时间范围,州ID和州类型。为了做到这一点,我必须将符合这一标准的女性总数除以符合标准的男性和女性总数。 我目前正在查询数据,以便在工程中从公司20中找到#females,其中kind和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)。

也为格式化道歉。

2 个答案:

答案 0 :(得分:0)

只需使用条件聚合:

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;

答案 1 :(得分: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*以避免整数除法,并且仅提供femalestotal列来感知上下文