Oracle SQL:从组中选择最大值和最小值

时间:2016-01-14 22:31:11

标签: sql oracle

我从多个表中选择产品,价值和合约期。我想按产品和发货周期对结果进行分组,同时对值进行求和。

我的合约期限可以是抵达或基于货运。因此,目前要确定使用哪个合同期,我正在查看其中一个期间描述是否为空,然后填充期末并根据该期限开始日期为出货或到货。具体来说,我正在使用以下内容。

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

有关确定哪个合同有效的方法的任何建议,然后使用最小和最大日期对结果进行分组,而不是在交换到达日期的发货日期,将非常感谢。

2 个答案:

答案 0 :(得分:0)

< p>基本思路是< em>而不是< / em>将不同的列组合成单个连续列。然后使用智能聚合:< / p> < pre>< code> t为(       <基本上是您的查询,但每个列单独>      ) 选择产品,ship_period_desc,        min(ship_period_desc =' ARRIVAL'然后是ARRIVAL_PERIOD_BEGIN的情况                 否则SHIP_PERIOD_BEGIN            结束)作为PERIOD_BEGIN,        min(ship_period_desc =' ARRIVAL'然后ARRIVAL_PERIOD_END的情况                 否则SHIP_PERIOD_END            结束)作为PERIOD_END 从T 其中ship_period_desc(' ARRIVAL',' SHIP') 按产品分类,ship_period_desc; < /代码>< /预>

答案 1 :(得分:0)

Oracle安装程序

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