2017-07-08 19 views
0

特定の基準(企業ID、職種、性別、時間枠、状態ID、状態)を満たすデータセット内の女性の割合を調べようとしています。種類。これを行うには、この基準を満たす女性の合計数を、基準を満たす男性と女性の合計数で除算しなければなりません。 私は現在、親切とid = 0で、すべての時間から、エンジニアリングでは、同社20から#女性を見つけるために、データを照会し、その基準を満たす合計#男性と女性で、それを分割しています:SQL - 特定の列の値が一致する同じデータセットのデータを分割する

/* 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にわたってデータセット内のすべての企業でこれを計算したいということです。私はそれらを自分で指定せずにこれを行う方法がわからず、誰かが助けることができるかどうか疑問に思っていました。私はDBMSに依存しない、クロスプラットフォームのSQLクエリツールであるSQLWorkbenchを使用しています。いくつかの助けに感謝します(私はTSQLまたはPL/pgSQLを使用していません)。

フォーマットにもお詫び申し上げます。

答えて

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列は単にコンテキストを知覚するために与えられる

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; 
関連する問題