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