2016-01-14 2 views
0

Из нескольких таблиц в настоящее время я выбираю продукт, значение и период контракта. Я хочу сгруппировать результаты по продукту и периоду отгрузки при суммировании стоимости.Oracle SQL: выберите максимальное и минимальное значение из группы

Мой контрактный период может быть основан на прибытии или на отправке. Итак, в настоящее время, чтобы определить, какой контрактный период использовать, я ищу, чтобы узнать, является ли одно из описаний периодов нулевым, а затем заполняет конец периода и начинает даты как на судне, так и на прибытии на основе этого. В частности, я использую следующее.

DECODE((P.SHIP_PERIOD_DESCR), NULL, 
'ARRIVE' || ' ' ||P.ARRIVAL_PERIOD_BEGIN || ' - ' || P.ARRIVAL_PERIOD_END, 
'SHIP' || ' ' ||P.SHIP_PERIOD_BEGIN || ' - ' || P.SHIP_PERIOD_END) 

Мои результаты являются такими:

PRODUCT  VALUE  CONTRACT_PERIOD 
APPLES  $600  SHIP 01-FEB-16 - 15-MAR-16 
APPLES  $700  SHIP 01-MAR-16 - 15-APR-16 
LEMONS  $200  SHIP 15-JAN-16 - 31-JAN-16 
LEMONS  $150  SHIP 01-FEB-16 - 15-FEB-16 
LEMONS  $200  ARRIVE 15-FEB-16 - 28-FEB-16 
LEMONS  $250  ARRIVE 01-MAR-16 - 15-MAR-16 

То, что я хотел бы видеть это минимальное судно или даты прибытия и максимальное судно или дата прибытия каждого продукта как такового:

PRODUCT  VALUE  CONTRACT_PERIOD 
APPLES  $1,300  SHIP 01-FEB-16 - 15-APR-16 
LEMONS  $350  SHIP 15-JAN-16 - 15-FEB-16 
LEMONS  $450  ARRIVE 15-FEB-16 - 15-MAR-16 

Любые предложения по способу определить, какой договор действителен, затем сгруппируйте результаты, используя минимальные и максимальные даты, не меняя дату отправки на дату прибытия.

+0

Вы должны показать свой более полный запрос. –

ответ

0

Oracle Setup:

CREATE TABLE table_name (product, value, ship_period_descr, arrival_period_begin, arrival_period_end, ship_period_begin, ship_period_end) AS 
SELECT 'Apples', 600, 'X', NULL, NULL, DATE '2016-02-01', DATE '2016-03-15' FROM DUAL UNION ALL 
SELECT 'Apples', 700, 'X', NULL, NULL, DATE '2016-03-01', DATE '2016-04-16' FROM DUAL UNION ALL 
SELECT 'Lemons', 200, 'X', NULL, NULL, DATE '2016-01-15', DATE '2016-01-31' FROM DUAL UNION ALL 
SELECT 'Lemons', 150, 'X', NULL, NULL, DATE '2016-02-01', DATE '2016-02-15' FROM DUAL UNION ALL 
SELECT 'Lemons', 200, NULL, DATE '2016-02-15', DATE '2016-02-28', NULL, NULL FROM DUAL UNION ALL 
SELECT 'Lemons', 250, NULL, DATE '2016-03-01', DATE '2016-03-15', NULL, NULL FROM DUAL; 

запроса:

SELECT Product, 
     SUM(Value) AS Value, 
     DECODE(
      DECODE(P.SHIP_PERIOD_DESCR, NULL, 1, 0), 
      1, 'ARRIVE ' || MIN(P.ARRIVAL_PERIOD_BEGIN) || ' - ' || MAX(P.ARRIVAL_PERIOD_END), 
       'SHIP ' || MIN(P.SHIP_PERIOD_BEGIN) || ' - ' || MAX(P.SHIP_PERIOD_END) 
     ) AS Contract_Period 
FROM  table_name p 
GROUP BY Product, 
     DECODE(P.SHIP_PERIOD_DESCR, NULL, 1, 0); 

Результаты:

PRODUCT  VALUE CONTRACT_PERIOD        
------- ---------- ---------------------------------------------- 
Apples  1300 SHIP 01-FEB-16 - 16-APR-16      
Lemons   350 SHIP 15-JAN-16 - 15-FEB-16      
Lemons   450 ARRIVE 15-FEB-16 - 15-MAR-16     
+0

Спасибо вам, я нашел оба метода для работы. – ESC

0

Основная идея: не, чтобы объединить разные столбцы в один конкатенированный столбец. Затем с помощью интеллектуальной агрегации:

with t as (
     <basically your query here, but with each column individually> 
    ) 
select product, ship_period_desc, 
     min(case when ship_period_desc = 'ARRIVAL' then ARRIVAL_PERIOD_BEGIN 
       else SHIP_PERIOD_BEGIN 
      end) as PERIOD_BEGIN, 
     min(case when ship_period_desc = 'ARRIVAL' then ARRIVAL_PERIOD_END 
       else SHIP_PERIOD_END 
      end) as PERIOD_END 
from t 
where ship_period_desc in ('ARRIVAL', 'SHIP') 
group by product, ship_period_desc; 
Смежные вопросы