2017-08-16 38 views
0

Sample Data Set and Desired Query Result跟蹤更改在零售商店的所有權隨時間

我已經改變所有權隨着時間的推移零售店列表(由公司所擁有,對許可或專利及回公司所擁有)。我試圖追蹤每個所有權類型下每月開放的商店數量。對於所有權的每次更改,我在數據集中都有一個新的行項目,每個行項目都有相應的更改開始和結束日期。

我試圖根據所有權類型爲每個月的數據計算商店,並且我無法計算出所有權的開始日期和結束日期之間的所有月份的商店數。希望這張照片能夠清楚地表明我想要做什麼。

select 
    b.fscl_yr_num 
    ,b.fscl_per_in_yr_num 
    ,a.ownr_type_cd 
    ,sum(case when a.line_start_dt < b.end_dt and a.line_end_dt <= b.End_Dt then 1 else 0 end) 
from 
(
    (
    select * 
    from 
     (select 
      store_num 
      ,ownr_type_cd 
      ,case when store_term_dt is not null then 'Closed' else 'Open' end as Status 
      ,case when to_date(trim(store_open_dt),'DD-MON-YY') > to_date(trim(eff_from_dt),'DD-MON-YY') then to_date(trim(store_open_dt),'DD-MON-YY') else to_date(trim(eff_from_dt),'DD-MON-YY') end as Line_Start_Dt 
      ,case when store_term_dt is null then eff_to_dt 
       when to_date(trim(store_term_dt),'DD-MON-YY') < to_date(trim(eff_to_dt),'DD-MON-YY') then to_date(trim(store_term_dt),'DD-MON-YY') else to_date(trim(eff_to_dt),'DD-MON-YY') end as Line_End_Dt 
     from 
      (select 
       store_num 
       ,store_open_dt 
       ,store_term_dt 
       ,eff_from_dt 
       ,eff_to_dt 
       ,ownr_type_cd 
      from 
       appca.d_store_vers 
      where 
       upper(cntry_cd_2_dgt_iso) = 'GB' 
       and postal_cd not like ('BT%') 
       and store_open_dt is not null 
      group by 
       store_num 
       ,store_open_dt 
       ,store_term_dt 
       ,eff_from_dt 
       ,eff_to_dt 
       ,ownr_type_cd 
      order by 
       store_num 
       ,eff_from_dt) 
     group by 
      store_num 
      ,ownr_type_cd 
      ,case when store_term_dt is not null then 'Closed' else 'Open' end 
      ,case when to_date(trim(store_open_dt),'DD-MON-YY') > to_date(trim(eff_from_dt),'DD-MON-YY') then to_date(trim(store_open_dt),'DD-MON-YY') else to_date(trim(eff_from_dt),'DD-MON-YY') end 
      ,case when store_term_dt is null then eff_to_dt 
       when to_date(trim(store_term_dt),'DD-MON-YY') < to_date(trim(eff_to_dt),'DD-MON-YY') then to_date(trim(store_term_dt),'DD-MON-YY') else to_date(trim(eff_to_dt),'DD-MON-YY') end 
     order by 
      1 asc 
      ,2 asc 
      ,3 asc) 
    where 
     to_date(trim(line_start_dt),'DD-MON-YY') < to_date(trim(line_end_dt),'DD-MON-YY') 
    ) A 
right join 

    --Calendar Table-- 
    (
    select 
     fscl_yr_num, fscl_per_in_yr_num, Cal_dt min(to_date(trim(cal_dt),'DD-MON-YY')) as Start_Dt, max(to_date(trim(cal_dt),'DD-MON-YY')) as End_Dt 
    from 
     appca.d_cal 
    where 
     fscl_yr_num is between 1990 and 2018 
    group by 
     fscl_yr_num, fscl_per_in_yr_num 
    order by 
     1 asc, 2 asc 
    ) B 
on A.line_end_dt = B.cal_dt 
) 
group by 
    b.fscl_yr_num 
    ,b.fscl_per_in_yr_num 
    ,a.ownr_type_cd 
order by 
    b.fscl_yr_num 
    ,b.fscl_per_in_yr_num 
; 
+0

請不要張貼鏈接的圖片。同時顯示你的嘗試。 – OldProgrammer

+0

好吧,我想出了一張照片是顯示結果的最簡單/最乾淨的方法。 –

+0

我修改了帖子以顯示我試過的代碼。但我真的只需要幫助在日期之間分配1到月份。 –

回答

0

嘗試這種情況:

sum(case when createTime >(cast(year(createTime) as varchar) +'-'+cast(MONTH(createTime) as varchar)+'-1') and createTime <(cast(year(createTime) as varchar) +'-'+cast(MONTH(createTime) as varchar)+'-31') 
then 1 else 0 end) 'Company'