質問: cmpgn.apply_date ) then 'キャンペーンあり' else 'キャンペーンなし' end as shisaku_flg ``` 【現状の全体の抽出文】 ``` with param as ( select '2018-02-07':: date apply_date_limit ,'2018-01-26':: date campaign_Start,'2018-02-09':: date campaign_End ) select shisaku_id, shisaku_name, demogra_flg, count(distinct kihon_id) as patarn_count from ( select cmpgn.shisaku_id, cmpgn.shisaku_name, cmpgn.kihon_id --【ここに、上記のキャンペーン利用の有無を判定するフラグを入れようと思っています】 , case gender when 1 then 'M' when 2 then 'F' end || case when old between 20 and 34 then '1' when old between 35 and 49 then '2' when old >= 50 then '3' end as demogra_flg from param left join campaign cmpgn on cmpgn.apply_date < param.apply_date_limit left join point_rireki2 pnt on cmpgn.kihon_id=pnt.kihon_id ) step1 group by shisaku_id, shisaku_name,demogra_flg order by shisaku_id,demogra_flg ``` 【現在の環境】 Windows Postgre(pgAdmin4内のクエリツールよりクエリを書いてます) を利用しています
回答: 先ず【検討中のフラグの仮案】ですが、case文中で完結しているので、相関問い合わせとなっていません。 次に、求める結果では0件も表示するのですから、ポイント履歴に求めても無いものは抽出されませんので、基準となるものが必要です。 以下は「pattern」として組合せ表を内部的に生成し、それとポイント履歴の集計表を結合して結果を求めるようにしています。 ``` with param as (-- パラメータ select '2018-02-07':: date apply_date_limit ,'2018-01-26':: date campaign_Start,'2018-02-09':: date campaign_End ) , pattern as (--組合せ表 select shisaku_flg, demogra_flg1 || demogra_flg2 as demogra_flg from unnest(array['キャンペーンあり','キャンペーンなし']::text[]) as x(shisaku_flg) cross join unnest(array['M','F']::text[]) as y(demogra_flg1) cross join unnest(array['1','2','3']::text[]) as z(demogra_flg2) ) , point_attribute as (--ポイント履歴属性追加 select kihon_id , case when exists( select 1 from campaign where apply_date < param.apply_date_limit and kihon_id=pnt.kihon_id and apply_date=pnt.p_date ) then 'キャンペーンあり' else 'キャンペーンなし' end as shisaku_flg , case gender when 1 then 'M' when 2 then 'F' end || case when old between 20 and 34 then '1' when old between 35 and 49 then '2' when old >= 50 then '3' end as demogra_flg from param cross join point_rireki2 pnt ) , point_agg as (--ポイント履歴属性集計 select shisaku_flg, demogra_flg, count(distinct kihon_id) as pattern_count from point_attribute group by shisaku_flg, demogra_flg order by shisaku_flg, demogra_flg ) -- パターン別集計表(組合せ表とポイント履歴属性集計を結合し件数を取得) select ptn.*, coalesce(pntagg.pattern_count,0) from pattern ptn left join point_agg pntagg on ptn.shisaku_flg=pntagg.shisaku_flg and ptn.demogra_flg=pntagg.demogra_flg order by shisaku_flg, demogra_flg ; ``` ※テストデータではgenderに定義に無い'3'がありますけど、それは組合せ表により除外されています。 追記 「キャンペーン期間:1/26~2/9」を条件に含めると、求めたい結果と異なるので含めていません。 必要なら、point_attribute内で条件を直接追加すれば確認できます。