SELECT MAX日期及其数量和该日期的SUM数量

时间:2019-11-08 04:35:13

标签: sql database oracle

我正在使用Oracle 11g。假设我有一个如下的交货表。 下面的示例显示最新日期为7/11/2019,并且该项目已两次交付,但数量不同。 如何获得最新日期(最大日期)及其数量以及数量的总和? enter image description here

我已经尝试过,并且得到了最大日期和最大数量的结果。但不是最大数量的总和。

SELECT DISTINCT k.item_no, 
MAX(k.date) OVER(PARTITION BY k.item_no) AS LATEST_DEL_DATE,
MAX(k.qty) KEEP(DENSE_RANK FIRST ORDER BY k.date DESC NULLS LAST) 
OVER(PARTITION BY k.item_no) AS LATEST_QUANTITY
FROM DEL k, DELCONFIRM h, ITEM o
where k.code_no=h.code_no
and k.item_no=o.item_no
AND k.qty<> 0
and k.item_no='123'
;

我希望输出结果看起来像

EXPECTED RESULT

3 个答案:

答案 0 :(得分:1)

您可以按如下方式使用分析函数(DENSE_RANK

SELECT
    ITEM_NO,
    DATE   AS LATEST_DEL_DATE,
    SUM(QTY) AS TOTAL_QTY
FROM
    (  SELECT DISTINCT
            K.item_NO,
            K.QTY,
            K.DATE,
            DENSE_RANK() OVER(
                PARTITION BY K.item_NO
                ORDER BY K.DATE DESC NULLS LAST
            ) AS DR
        FROM
            DEL K 
            JOIN  DELCONFIRM H ON (K.code_NO = H.code_NO)
            JOIN ITEM O ON (K.item_NO = O.item_NO)
            WHERE K.QTY <> 0
            AND K.GOO_NO = '123'
    )
WHERE DR = 1
GROUP BY ITEM_NO, DATE;

注意:如上述查询所示,使用标准ANSI连接。

干杯!

答案 1 :(得分:1)

您可以JOIN将交货表转换为感兴趣项目的最新交货日期的派生表,然后SUM将该日期的交货数量:

SELECT m.item_code, 
       m.max_date AS "Latest_delivery_date",  
       SUM(d1.quantity) AS "Total_delivered"
FROM (SELECT item_code, MAX(date) AS max_date
      FROM delivery
      WHERE item_code = 123) m
JOIN delivery d1 ON d1.item_code = m.item_code AND d1.date = m.max_date
GROUP BY m.item_code, m.max_date

输出:

item_code   Latest_delivery_date    Total_delivered
123         2019-11-07              17

Demo on dbfiddle

答案 2 :(得分:1)

使用聚合和窗口功能:

select id.*
from (select k.item_code, k.date, sum(k.qty) as sum(qty),
             row_number() over (partition by k.item_code order by k.date desc) as seqnum
      from Del k join
           Delconfirm h
           on k.seq_no = h.seq_no join 
           ITEM o
           on k.item_no = o.item_no
      where  k.QTY <> 0 and
            k.item_no = '123'
      group by k.item_no
     ) id
where seqnum = 1;

请特别注意使用正确,明确的标准 JOIN语法。 请勿在{{1​​}}子句中使用逗号。