Как группировать при использовании агрегатов в операторе выбора - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь запустить следующий код, но получаю сообщение об ошибке из-за последнего поля в инструкции SELECT, которое содержит как агрегатное условие, так и нормальное условие
trunc (d.ead_date) - trunc (max (d.pickup_date_ts)) AS diff_ead_cpt_max

Ошибка в основном говорит о том, что агрегаты не разрешены в предложении GROUP BY. Если я уберу максимум, тогда он будет работать, но тогда я не получу правильные результаты.

SELECT
       w1.physical_country origin_country,
       a.leg_warehouse_id lm_warehouse_id,


       b.leg_warehouse_id fl_warehouse_id,


       c.plane_name,
       k.leg_ware,
       k.last_ds,

       trunc(a.ead_date) ead_date,
       max(d.pickup_date_ts) max_cpt,
       to_char(max(d.pickup_date_ts),'HH24:MI') max_cpt_time,
       trunc(max(d.pickup_date_ts)) max_cpt_date,
       trunc(d.ead_date)- trunc(max(d.pickup_date_ts)) AS diff_ead_cpt_max

from
       final_leg a 
       inner join dest_leg b 
       on a.shipment_id = b.shipment_id and a.route_id = b.route_id
       inner join sc_execution_eu.o_detailed_routes_v2 d 
       on a.shipment_id = d.shipment_id and a.route_id = d.route_id and d.leg_sequence_id = 0
       left join plane_leg c
       on a.shipment_id = c.shipment_id and a.route_id = c.route_id
       left join warehouse_attributes w1
       on a.route_warehouse_id = w1.warehouse_id
       left join warehouse_attributes w2
       on b.leg_warehouse_id = w2.warehouse_id
       RIGHT JOIN list_legs_ds k
       on a.route_warehouse_id = k.leg_ware AND a.leg_warehouse_id = k.last_ds


group by
       1,2,3,4,5,6,7,11

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вы не можете удалить max, как вы уже сказали, поскольку pickup_date_ts как неагрегированный столбец, не внесенный в список GROUP BY.

Попробуйте trunc( max(trunc(d.ead_date) - d.pickup_date_ts)).

Кстати, не рекомендуется использовать порядковые номера столбцов в выражении GROUP BY, некоторые изменения в списке SELECT могут повлиять на них, скорее, напишите имена столбцов явно.

1 голос
/ 04 июля 2019

GROUP BY неагрегированные значения и использовать имена столбцов:

SELECT
       w1.physical_country origin_country,
       a.leg_warehouse_id lm_warehouse_id,
       b.leg_warehouse_id fl_warehouse_id,
       c.plane_name,
       k.leg_ware,
       k.last_ds,
       trunc(a.ead_date) ead_date,
       max(d.pickup_date_ts) max_cpt,
       to_char(max(d.pickup_date_ts),'HH24:MI') max_cpt_time,
       trunc(max(d.pickup_date_ts)) max_cpt_date,
       trunc(d.ead_date)- trunc(max(d.pickup_date_ts)) AS diff_ead_cpt_max

from
       final_leg a 
       inner join dest_leg b 
       on a.shipment_id = b.shipment_id and a.route_id = b.route_id
       inner join sc_execution_eu.o_detailed_routes_v2 d 
       on a.shipment_id = d.shipment_id and a.route_id = d.route_id and d.leg_sequence_id = 0
       left join plane_leg c
       on a.shipment_id = c.shipment_id and a.route_id = c.route_id
       left join warehouse_attributes w1
       on a.route_warehouse_id = w1.warehouse_id
       left join warehouse_attributes w2
       on b.leg_warehouse_id = w2.warehouse_id
       RIGHT JOIN list_legs_ds k
       on a.route_warehouse_id = k.leg_ware AND a.leg_warehouse_id = k.last_ds
group by
       w1.physical_country origin_country,
       a.leg_warehouse_id lm_warehouse_id,
       b.leg_warehouse_id fl_warehouse_id,
       c.plane_name,
       k.leg_ware,
       k.last_ds,
       trunc(a.ead_date),
       trunc(d.ead_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...