2016-05-25 3 views
-1

Заранее благодарю вас за помощь. Вот сценарий. У меня есть две таблицы: Лоты (информация о лотах магазинов для продуктов питания) и Trans (хранит транзакции инвентаря по лотам).T-SQL: AGGREGATE AND/OR CONDITIONAL SUBQUERY ON WHERE CLAUSE

Я пытаюсь написать запрос, в котором перечислены все операции, которые старше 90 дней на основе 3 условий на ИНЕКЕ как-то:

  1. CurrentQty (по лотам таблице)> 0
  2. If TransactionType = Пересылка и TransactionDate> 90 дней (от текущей даты) или ..
  3. IF TransactionType = Квитанция И TransactionDate> 90 дней (от текущей даты)

Примечание: для каждого Ио t, может быть много разных транзакций одного типа, как показано на прилагаемом рисунке. Там может быть много отправлений или квитанций. Мне нужно выбрать MAX (TransactionDate) для определенного типа транзакции и проверить, не превышает ли это более 90 дней, а затем показать запись.

В каждой таблице транзакций всегда будет по крайней мере один из этих двух типов транзакций, будь то Отгрузка или Квитанция. Если для конкретной партии нет типа транзакции отправки, я хочу использовать условие Max (TransactionDate)> 90 для типа транзакции «получение».

Мне нужно оценить все эти условия для каждой партии, а также конкретные транзакции.

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

SELECT 
    LOTS.LOTNUMBER, TRANS.ITEMNUMBER, TRANS.DESCRIPTION, 
    TRANS.TRANSACTIONTYPE, TRANS.TRANSACTIONDATE, TRANS.WAREHOUSE, 
    TRANS.QUANTITY 
FROM 
    LOTS 
INNER JOIN 
    TRANS ON LOTS.LOTNUMBER = TRANS.LOTNUMBER 
WHERE 
    LOTS.CURRENTQUANTITY > 0 

TABLES

+2

пожалуйста переустановите CAPS LOCK. ЯВЛЯЕТСЯ, ЧТОБЫ БЫЛО БЫЛО, КОГДА ВЫ ПОДТВЕРДИЛИ НАЗВАНИЕ ВАШЕГО ВОПРОСА. Либо это, либо вы очень грубы и ОБРАЩАЙТЕСЬ НА США, и в этом случае вам также нужно это прекратить. Мы все можем читать очень хорошо, ОБРАТИТЬ ваш вопрос не даст вам ответа быстрее, а ОБРАТИТЬСЯ В США - это действительно раздражающее и невежливое поведение. –

+0

Вы ограничены одним номером лота за раз в номер элемента? В противном случае это немного странно. – DaveX

+0

Привет, Кен Уайт, извините, я только что присоединился к этому форуму сегодня и все еще пытаюсь понять, в том числе и правильный протокол. Мои извинения. – Marcos

ответ

0
SELECT 
    LOTS.LOTNUMBER, TRANS.ITEMNUMBER, TRANS.DESCRIPTION, 
    TRANS.TRANSACTIONTYPE, TRANS.TRANSACTIONDATE, TRANS.WAREHOUSE, 
    TRANS.QUANTITY 
FROM 
    LOTS 
INNER JOIN 
    (Select LotNumber, Max(TransactionDate) MaxTransDate From TRANS Group By LotNumber) Trans ON LOTS.LOTNUMBER = TRANS.LOTNUMBER 
WHERE 
    LOTS.CURRENTQUANTITY > 0 And 
    DATEDIFF(d, TRANS.TRANSACTIONDATE, getdate()) > 90 And 
    (TRANS.TRANSACTIONTYPE = 'Reciept' Or 
    TRANS.TRANSACTIONTYPE = 'Shipment') 
0
DECLARE @lots TABLE (
    LotNumber   NVARCHAR(10) 
    ,ItemNum   NVARCHAR(12) 
    ,CurrentQty   INT 
    ) 

DECLARE @trans TABLE (
    TransNum   INT 
    ,ItemNum   NVARCHAR(12) 
    ,Description  NVARCHAR(30) 
    ,TransType   NVARCHAR(10) 
    ,TransDate   DATE 
    ,Warehouse   NVARCHAR(5) 
    ,Quantity   INT 
    ) 

INSERT INTO @lots VALUES 
    ('ABC','10-MAND-5879',925) 

INSERT INTO @trans VALUES 
    (398741,'10-MAND-5879','10 Lb Mandarin Bag','Receipt','2016-01-01','IXCST',100) 
    ,(973541,'10-MAND-5879','10 Lb Mandarin Bag','Shipment','2016-02-04','WTGS',365) 
    ,(972547,'10-MAND-5879','10 Lb Mandarin Bag','Receipt','2016-02-29','GKWK',250) 
    ,(632403,'10-MAND-5879','10 Lb Mandarin Bag','Shipment','2016-03-01','GWSJ',150) 
    ,(692147,'10-MAND-5879','10 Lb Mandarin Bag','Shipment','2016-03-17','ABTK',25) 

;WITH MaxShip 
    AS (
     SELECT ItemNum, TransNum, 
      ROW_NUMBER() OVER (PARTITION BY ItemNum ORDER BY TransDate DESC) AS TransOrder 
      FROM @trans 
       WHERE TransType = 'Shipment' 
      ), 

MaxRcpt 
    AS (
     SELECT ItemNum, TransNum, 
      ROW_NUMBER() OVER (PARTITION BY ItemNum ORDER BY TransDate DESC) AS TransOrder 
      FROM @trans 
       WHERE transtype = 'Receipt' 
      ) 

SELECT * 
    FROM @trans t 
     LEFT JOIN @lots l 
      ON t.ItemNum = l.ItemNum 
     JOIN MaxShip ms 
      ON ms.TransNum = t.TransNum 
    WHERE TransOrder = 1 AND CurrentQty > 0 AND DATEADD(dd,90,TransDate) < GETDATE() 
UNION 
SELECT * 
    FROM @trans t 
     LEFT JOIN @lots l 
      ON t.ItemNum = l.ItemNum 
     JOIN MaxRcpt mr 
      ON mr.TransNum = t.TransNum 
    WHERE TransOrder = 1 AND CurrentQty > 0 AND DATEADD(dd,90,TransDate) < GETDATE() 
+0

Здравствуйте, DaveX и Joe C, благодарю вас за ваши ответы. Я попробовал оба ваших решения, но по какой-то причине я не получаю никаких записей. Вероятно, я должен это разъяснить. Если есть тип транзакции «отгрузки», это будет единственное, что мне нужно для оценки состояния> 90. На образце скриншота есть желтая подсветка, которая показывает, что эта транзакция старше 90 дней по сравнению с другими транзакциями отправки. Если для партии нет типов транзакций отправки, я бы использовал транзакцию квитанции для оценки> 90 с использованием последней даты передачи – Marcos