ВЫБЕРИТЕ МАКСИМАЛЬНУЮ дату и ее количество и СУММУ количество на эту дату - PullRequest
0 голосов
/ 08 ноября 2019

Я использую Oracle 11g. скажем, у меня есть таблица доставки, как показано ниже. В приведенном ниже примере показано, что самая последняя дата - 7/11/2019, и товар доставляется дважды с разным количеством. Как получить последнюю дату (максимальная дата) и ее количество, а также сумму количества? enter image description here

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

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Вы можете 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

Демонстрация на dbfiddle

1 голос
/ 08 ноября 2019

Использовать агрегацию и оконную функцию:

select id.*
from (select k.item_code, k.kdate, sum(k.qty) as sum(qty),
             row_number() over (partition by k.item_code order by k.kdate desc) as seqnum
      from DCFTOTI k join
           DCFTTO01 h
           on k.seq_no = h.seq_no join 
           MKFITEM o
           on k.item_no = o.item_no
      where h.tto_code = '2F' and
            k.QTY <> 0 and
            k.item_no = '123'
      group by k.item_no
     ) id
where seqnum = 1;

Обратите внимание, в частности, на использование правильного, явного, стандартного JOIN синтаксиса. Никогда не используйте запятые в предложении FROM.

1 голос
/ 08 ноября 2019

Вы можете использовать аналитическую функцию (DENSE_RANK) следующим образом:

SELECT
    GOO_NO,
    KDATE   AS LATEST_DEL_DATE,
    SUM(QTY) AS TOTAL_QTY
FROM
    (  SELECT DISTINCT
            K.GOO_NO,
            K.QTY,
            K.KDATE,
            DENSE_RANK() OVER(
                PARTITION BY K.GOO_NO
                ORDER BY K.KDATE DESC NULLS LAST
            ) AS DR
        FROM
            DCFTTOTI K 
            JOIN  DCFTTO01 H ON (K.SEQ_NO = H.SEQ_NO)
            JOIN MKFGOOMI O ON (K.GOO_NO = O.GOO_NO)
        WHERE H.TTO_CODE = '2F'
            AND K.QTY <> 0
            AND K.GOO_NO = '123'
    )
WHERE DR = 1
GROUP BY GOO_NO, KDATE;

Примечание: Используйте стандартные соединения ANSI, как показано в вышеупомянутом запросе.

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...