2017-05-31 13 views
0

私は自分の仕事にOracleを使用していますが、次のスクリプトを持っています。データとゾーン番号を入れてテーブルaとdに移動したいと思います。しかし、私のテーブルでは、私はドン; tはシフトを持っているので、私はステートメントを現金を使用してシフトを作成するが、私はテーブルのシフトで作成したシフトに参加する必要がありますが、SQLの作品と私にしたいデータを与えるが、これが正しい方法であることを確認したいだけです!Where節の節を使用する場合

select distinct 
    a.trn_plan_date as route_date, 
    next_day(a.trn_plan_date - 1,'Sunday') as route_week, 
    a.trn_zone_code as zone, 
    case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end as shift, 
    d.ampm_shift, 
    max(d.ups_checkin_time) as Ups, 
    d.productivity_region, 
    'PLANNED_DEPOT_RUNNER' as hour_type, 
    24*(a.truck_endtime - a.truck_dispatchtime)*count(distinct b.trn_resource_id) as hours, 
    c.last_week as last_week_flag, 
    c.month_to_date as month_to_date_flag, 
    c.last_month as last_month_flag 
from 
    fd_stg.trn_plan_tra a, 
    fd_stg.trn_plan_resource_tra b, 
    fd_dw.date_dim c, 
    fd_dw.route_dim d 
where 
    a.trn_plan_id = b.trn_plan_id 
    and a.trn_plan_date = c.calendar_date 
    and case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end=d.ampm_shift 
    and a.trn_plan_date = d.route_date 
    and a.trn_zone_code = d.zone 
    and (c.last_month='Y' 
     or c.month_to_date='Y' 
     or c.last_week='Y')  
    and (a.trn_region_code = 'Depot' or a.trn_zone_code in('970','971')) 
    and b.role = '003' 
    and a.trn_zone_code is not null 
group by 
    a.trn_plan_date, 
    a.trn_zone_code, 
    case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end, 
    d.productivity_region, 
    d.ampm_shift, 
    a.truck_endtime - a.truck_dispatchtime, 
    c.last_week, 
    c.month_to_date, 
    c.last_month 
    Order by 1,3,4 
+0

*決して* FROM句にカンマを使用しないでください。 *常に*適切で明示的な 'JOIN'構文を使用します。 –

+0

ありがとう、私はそれに注意します。しかし、あなたは私のスクリプトに何か間違っていることを教えてもらえますか、特に私はシフトを一緒に参加するwhere句へのケースを使用しました –

答えて

2

あなたは句が適切であるところでCASE .. WHENのかどうか、使用について質問しているようです。あなたが持っているものは大丈夫です。 Gordonは、ANSIスタイルの結合を使用して参照しています。私は例としてANSI結合(FROM句)を書き直しました。

select distinct 
     a.trn_plan_date as route_date, 
     next_day(a.trn_plan_date - 1,'Sunday') as route_week, 
     a.trn_zone_code as zone, 
     case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end as shift, 
     d.ampm_shift, 
     max(d.ups_checkin_time) as Ups, 
     d.productivity_region, 
     'PLANNED_DEPOT_RUNNER' as hour_type, 
     24*(a.truck_endtime - a.truck_dispatchtime)*count(distinct b.trn_resource_id) as hours, 
     c.last_week as last_week_flag, 
     c.month_to_date as month_to_date_flag, 
     c.last_month as last_month_flag 
    from 
     fd_stg.trn_plan_tra a 
     inner join fd_stg.trn_plan_resource_tra b on (a.trn_plan_id = b.trn_plan_id and b.role = '003') 
     inner join fd_dw.date_dim c on (a.trn_plan_date = c.calendar_date 
              and (c.last_month='Y' 
              or c.month_to_date='Y' 
              or c.last_week='Y')) 
     inner join fd_dw.route_dim d on (case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end=d.ampm_shift 
              and a.trn_plan_date = d.route_date 
              and a.trn_zone_code = d.zone) 
    where 
      (a.trn_region_code = 'Depot' or a.trn_zone_code in('970','971')) 
     and a.trn_zone_code is not null 
    group by 
     a.trn_plan_date, 
     a.trn_zone_code, 
     case when to_number(to_char(a.cutoff_datetime,'HH24'))<20 then 'AM' else 'PM' end, 
     d.productivity_region, 
     d.ampm_shift, 
     a.truck_endtime - a.truck_dispatchtime, 
     c.last_week, 
     c.month_to_date, 
     c.last_month 
     Order by 1,3,4 
+0

ありがとうございました! –