Sql server T-SQL:WHERE子句上的聚合和/或条件子查询

Sql server T-SQL:WHERE子句上的聚合和/或条件子查询,sql-server,tsql,Sql Server,Tsql,提前感谢您在这方面的帮助。下面是场景。我有两个表:Lots(存储食品项目的批次信息)和Trans(存储批次项目的库存交易) 我试图编写一个查询,根据where子句的3个条件列出所有超过90天的事务: 当前数量(批次表上)>0 如果TransactionType=装运和交易日期>90天(从当前日期算起),或 如果交易类型=收据和交易日期>90天(从当前日期算起) 注:如所附图片所示,对于每个批次,可能有许多相同类型的不同交易。可能有很多货物或收据。我需要能够为特定交易类型选择最大(Transact

提前感谢您在这方面的帮助。下面是场景。我有两个表:Lots(存储食品项目的批次信息)和Trans(存储批次项目的库存交易)

我试图编写一个查询,根据where子句的3个条件列出所有超过90天的事务:

  • 当前数量(批次表上)>0
  • 如果TransactionType=装运和交易日期>90天(从当前日期算起),或
  • 如果交易类型=收据和交易日期>90天(从当前日期算起)
  • 注:如所附图片所示,对于每个批次,可能有许多相同类型的不同交易。可能有很多货物或收据。我需要能够为特定交易类型选择最大(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
    

    DECLARE@lots表(
    LotNumber NVARCHAR(10)
    ,ItemNum NVARCHAR(12)
    ,当前数量INT
    )
    声明@trans表(
    TransNum INT
    ,ItemNum NVARCHAR(12)
    ,说明NVARCHAR(30)
    ,TransType NVARCHAR(10)
    ,转换日期
    ,仓库NVARCHAR(5)
    ,数量整数
    )
    插入到@lots值中
    ('ABC','10-MAND-5879',925)
    插入@trans值
    (398741、'10-MAND-5879'、'10磅文华袋'、'收据'、'2016-01-01'、'IXCST',100)
    ,(973541,'10-MAND-5879','10磅文华袋','Shipping','2016-02-04','WTGS',365)
    ,(972547,'10-MAND-5879','10磅文华袋','收据','2016-02-29','GKWK',250)
    ,(632403,'10-MAND-5879','10磅文华袋','Shipping','2016-03-01','GWSJ',150)
    ,(692147,'10-MAND-5879','10磅文华袋','Shipping','2016-03-17','ABTK',25)
    ;与麦克希普
    作为(
    选择ItemNum、TransNum、,
    (按ItemNum ORDER按TransDate DESC划分)上的行号()作为TransOrder
    来自@trans
    其中TransType='shipping'
    ),
    MaxRcpt
    作为(
    选择ItemNum、TransNum、,
    (按ItemNum ORDER按TransDate DESC划分)上的行号()作为TransOrder
    来自@trans
    其中transtype='Receipt'
    )
    挑选*
    来自@trans t
    左连接@地块l
    在t.ItemNum=l.ItemNum上
    加入MaxShip ms
    在ms.TransNum=t.TransNum上
    其中TransOrder=1,CurrentQty>0,DATEADD(dd,90,TransDate)0,DATEADD(dd,90,TransDate)
    请把你的帽子锁好。当您键入问题的标题时,它似乎被卡住了。要么是这样,要么就是你太粗鲁了,对我们大喊大叫,在这种情况下,你也需要停止这种行为。我们都能读得很好,大声问你的问题并不能让你更快地得到答案,对我们大声嚷嚷真的是一种恼人和不礼貌的行为。你是不是每次只限于一个LotNumber?否则这会有点奇怪。你好,肯·怀特,我很抱歉,我今天刚加入这个论坛,仍然在努力解决问题,包括正确的协议。抱歉,你好,达维克斯,谢谢你的回复。一个批次始终只包含一个项目编号。例如,永远不会有很多东西包含苹果和梨。你好,DaveX和Joe C,非常感谢你的回复。我已经尝试了你的两种解决方案,但由于某种原因,我没有得到任何记录回来。我可能应该澄清这一点。如果存在“装运”事务类型,那将是我评估>90条件时唯一关心的事情。在屏幕截图示例中,有一条高亮显示的黄色记录显示,与其他装运交易相比,此交易的时间早于90天。如果很多批次没有发货交易类型,那么我将使用收据交易来评估>90的最新交易日期
    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')
    
    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()