2016-05-25 34 views
-1

在此先感謝您的幫助。這是場景。我有兩個表格:批次(存儲食物項目的批量信息)和Trans(存儲批次項目中的庫存交易)。T-SQL:聚集和/或條件子查詢條件

我想寫一個查詢,列出了所有基於where子句不知何故3個條件超過90天的交易:

  1. CurrentQty(上大量表)> 0
  2. 如果TRANSACTIONTYPE =裝運和TransactionDate> 90日(從當前日期)OR ..
  3. IF TRANSACTIONTYPE =接收和TransactionDate> 90日(從當前日期)

注:對於每個LO噸,可能有許多不同的相同類型的交易,如附圖所示。可能有很多貨物或收據。我需要能夠爲特定交易類型選擇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

您是否每個ItemNumber限制爲一次LotNumber?否則這有點奇怪。 – 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