SQL有许多查询选择1
我有两个表要查询 库存表 股票代码 股票名称 实物库存 订单表 订单日期 量 股票代码 我正在查找所有库存记录,其中实际库存大于0,以及最后一次订购日期 我认为下面的查询可以做到这一点,但这会复制每个订单数量的库存记录SQL有许多查询选择1,sql,sql-server,Sql,Sql Server,我有两个表要查询 库存表 股票代码 股票名称 实物库存 订单表 订单日期 量 股票代码 我正在查找所有库存记录,其中实际库存大于0,以及最后一次订购日期 我认为下面的查询可以做到这一点,但这会复制每个订单数量的库存记录 SELECT Stock_Code, Physical_Stock, Order_Date FROM Stock_Table INNER JOIN Order_Table ON Stock_Table.Stock_code = Order_Tabl
SELECT
Stock_Code,
Physical_Stock,
Order_Date
FROM Stock_Table
INNER JOIN Order_Table
ON Stock_Table.Stock_code = Order_Table.Stock_Code
WHERE Physical_Stock <> 0
以下是交叉应用top 1解决方案:
SELECT Stock_Code, Physical_Stock, Order_Date
FROM
Stock_Table
CROSS APPLY
(
SELECT TOP 1 Order_Date
FROM Order_Table
WHERE Stock_Table.Stock_code = Order_Table.Stock_Code
order by Order_Date desc
)q
Where Physical_Stock <> 0
如果您愿意,也可以从最近的orderdate中提取更多列。大于0或0是哪个
您只需要使用聚合函数max来获取最大订单日期,因为可以为给定的股票代码下多个订单。由于您使用聚合,因此非聚合列需要group by
SELECT Stock_Code, Physical_Stock, max(Order_Date)
FROM Stock_Table
INNER JOIN Order_Table
ON Stock_Table.Stock_code = Order_Table.Stock_Code
WHERE Physical_Stock <> 0
GROUP BY Stock_Code, Physical_Stock
使用GroupBy
SELECT
Stock_Table.Stock_Code,
Max(Physical_Stock) As Stock,
Max(Order_Date) As LastDate
FROM
Stock_Table INNER JOIN
Order_Table ON Stock_Table.Stock_code = Order_Table.Stock_Code
Where Physical_Stock > 0
Group By Stock_Table.Stock_Code
你需要maxorder_date和group by stock_code,Physical_stock,你说stock>0,但显示不等于0,这是什么?Physical stock不能小于0,所以0在逻辑上可以工作。K,我曾使用过许多系统,其中stock可能是负面的,例如我们刚发货的产品;但是hand还没有完成系统更新,显示它已经签入了。这样行吗?我不认为可以在where中限制窗口函数的选择结果,因为where在选择之前执行;这就是为什么我经常在子查询或CTE中看到winnow函数的原因。@xQbert我更新了我的答案,并用测试数据进行了测试,它确实会返回每个唯一的库存项目及其最近的购买日期。@xQbert是的,谢谢你的更正,如果没有SQL,我不太擅长写这些东西,你会明白的,多年来,当你开始识别模式中的模式/错误时,写下这么多这些内容。@xQbert谢谢你的鼓励,我很感激。是的,这确实是一种从订单表中获取额外列的有用技术。只需要安装在更新版本的SQL server上。不知道交叉申请什么时候来的。。。2012? 哇2005。。。伟大的解决方案我需要更新我对这些技术的使用。。我太老了。为什么maxphysical\u Stock它来自Stock表,而order\u date是order\u表,因此1:m问题在order表上。假设stock_代码是PK,那么在一个唯一的值上得到一个最大值似乎很奇怪……这确实看起来很奇怪,但因为它来自关系的1方,所以它可以工作,而且我认为它比具有多列的GroupBy更快。回答不错,+1
SELECT
Stock_Table.Stock_Code,
Max(Physical_Stock) As Stock,
Max(Order_Date) As LastDate
FROM
Stock_Table INNER JOIN
Order_Table ON Stock_Table.Stock_code = Order_Table.Stock_Code
Where Physical_Stock > 0
Group By Stock_Table.Stock_Code