#teradata
Вопрос:
Мне нужно вывести 2 поля SPEED_UPGRADE и TV_PACKAGE из 3 таблиц. Я написал код ниже. Я не получаю правильного подсчета «СКОРОСТИ» и «ТЕЛЕВИЗОРА», которые находятся между start_dt и END_DT. скорее, это дает мне подсчет всех «СКОРОСТИ» и «ТЕЛЕВИЗОРА». Пожалуйста, оптимизируйте мой запрос .
select lt;few columnsgt;, count (case WHEN Cast('2021-11-09 00:00:00' AS TIMESTAMP(0)) BETWEEN a.START_DT AND Coalesce(a.END_DT,Cast('9999-12-31 00:00:00' AS TIMESTAMP FORMAT 'Y4-MM-DDBHH:MI:SS')) AND b.VOUCHER_TYPE_CD='SPEED' then 1 ELSE 0 end) SPEED_UPGRADE, count(case WHEN Cast('2021-11-09 00:00:00' AS TIMESTAMP(0)) BETWEEN a.START_DT AND Coalesce(a.END_DT,Cast('9999-12-31 00:00:00' AS TIMESTAMP FORMAT 'Y4-MM-DDBHH:MI:SS')) AND b.VOUCHER_TYPE_CD='TV' then 1 ELSE 0 end) TV_PACKAGE FROM (sel * from P0_view.edw_v_fct_subscriber_household_base where subscriber_status_cd ='Active' and billed_customer_id ='-1' and household_id gt;0 and household_base_dt='2021-11-09' ) f right join P0_VIEW.EDW_V_FCT_FIXED_VOUCHER_REDEEMED a on f.CUSTOMER_ID=a.CUSTOMER_ID left join P0_VIEW.EDW_V_DIM_FIXED_VOUCHER b on a.FIXED_VOUCHER_ID = b.FIXED_VOUCHER_ID group by 1,2,3,4,5,6,7,8,9 ) q ;
Комментарии:
1. В своем » еще » вы считаете 0. Вы хотите использовать либо sum, либо count null. Другими словами, подсчет 10 0s вернет 10.
2. И они
Cast('9999-12-31 00:00:00' AS TIMESTAMP FORMAT 'Y4-MM-DDBHH:MI:SS')
могут быть переписаны как литеральные метки времени:TIMESTAMP '9999-12-31 00:00:00