как сделать союз с предложением где - PullRequest
0 голосов
/ 25 сентября 2019

Я все еще учусь писать, и приведенный ниже запрос не дает мне точных результатов, плюс он также не оптимизирован.

Итак, одна из главных вещей, которые я пытаюсь сделать, - это создать 3 типа дат:

  • sales_shift,
  • refund,
  • sales_reg

в моих наборах данных.Чтобы добиться этого, я делаю союз.

Все 3 набора данных запрашивают один и тот же источник sales_main.Проблема в моем втором наборе данных с 'Refund' в качестве date_type, он не вытягивает фактические строки из-за условия ColumnA = 'B'.

Мне бы хотелось, чтобы этот набор просматривал только те записи, которые были извлечены в первом наборе данных (т. Е. 'Sales_shift' как date_type), а затем применил условие ColumnA = 'B'.как мне это сделать.

Мой 3-й набор данных с 'sales_reg' в качестве date_type должен быть таким же, как 1-й набор, за исключением того, что транзакция_дата не смещена.Как я это сделал.Я думал о том, где существует, но не знаю, как его применить.

Любая помощь будет потрясающей.Большое спасибо

create table sales_refund as select * from (
with table1 as (select 'Sales_shift' as date_type,
            add_months(date_trunc('month',transaction_date),1) as event_date,
            sku,
            sum(sales) as Sales_total,
            sum(refund) as Refund_total,
            case when region in ('US','EU') then 'type A' else 'type B' end as Flag_field1
            from sales_main where transaction_date >= add_months(current_date(),-6)
            group by sku,
            'Sales_shift' 
            add_months(date_trunc('month',transaction_date),1),
            Flag_field1),
table2 as (select sku,
                 date_type,
                 event_date,
                 Sales_total,
                 Refund_total,
                 Flag_field1,
                 case when Flag_field1 = 'type B' or (Flag_field1 = 'type A' and Sales_total > 20000) then 'Yes' else 'No' end as Flag_field2

                      from table1 )
Select       sku,
                 date_type,
                 event_date,
                 Sales_total,
                 Refund_total,
                 Flag_field1
     fromm table2 where Flag_field2 = 'Yes' )

union all        
               select  sku,
           'Refund' as date_type,
            date_trunc('month',refund_date) as event_date,
            sum(sales) as Sales_total,
            sum(refund) as Refund_total,
            'X' as Flag_field1
            from sales_main where transaction_date >= add_months(current_date(),-6) and ColumnA = 'B'
            group by sku,
            'Refund' 
            date_trunc('month',refund_date),
            'X'

union all        
               select  sku,
           'Sales_Reg' as date_type,
            date_trunc('month',transaction_date) as event_date,
            sum(sales) as Sales_total,
            sum(refund) as Refund_total,
            'Y' as Flag_field1
            from sales_main where transaction_date >= add_months(current_date(),-6) 
            group by sku,
            'Refund' 
            date_trunc('month',transaction_date),
            'Y'

...