[英]Syntax of MS Access/SQL sub-query including aggregate functions
我试图建立一个数据库来管理设备维护。 我有两个表:
我想要一个显示下一次维修日期的查询。 到目前为止,我有:
SELECT Max(DateAdd('m', [Inventory].[Service Period],
[WorkDone].[Work Date])) AS NextServiceDate,
Inventory.Equipement
FROM Inventory INNER JOIN WorkDone ON Inventory.ID = WorkDone.Equipment
GROUP BY Inventory.Equipement
只要已为给定设备记录了已完成的某些工作,此方法就很好用。 如果未执行任何工作,我希望NextServiceDat e也显示
DateAdd('m',[Inventory].[Service Period], [Inventory].[Purchase Date])
但是,我不知道如何获取SQL / MS访问权限以比较两个值,而仅显示两个中较大的一个。 通过阅读,我认为我应该能够进行子查询,但是我无法弄清楚如何对其进行阶段化。
我一直在尝试从此处适应@MikeTeeVee的回答: SQL Server中是否有一个Max函数接受两个值,如.NET中的Math.Max? 。 但是我不断收到错误消息,说查询不是聚合函数的一部分,而且我不确定自己做错了什么。 例如,我尝试过:
SELECT Inventory.Equipement,
(SELECT MAX(NSD_proxy)
FROM (VALUES
(Max(DateAdd('m', Inventory.[Service Period], WorkDone.[Work Date]))),
(DateAdd('m', Inventory.[Service Period], Inventory.[Purchase Date])))
AS FUNCTION(NSD_proxy)
) AS NextServiceDate,
FROM Inventory INNER JOIN WorkDone ON Inventory.ID = WorkDone.Equipment
GROUP BY Inventory.Equipement
这有一些语法错误。
您不必比较两个日期,只需检查是否存在WorkDone
记录与Inventory
记录匹配即可。
您可以使用:
IIF(ISNULL(WorkDone.Equipment),
DateAdd('m',[Inventory].[Service Period],[Inventory].[Purchase Date]),
Max(DateAdd('m',[Inventory].[Service Period],[WorkDone].[Work Date])))
AS NextServiceDate
您查询的其余部分可以保持不变。
考虑一个LEFT JOIN
返回匹配或不匹配的记录,后者用NULL填充,然后使用NZ()运行聚合MAX
:
SELECT Max(NZ(DateAdd('m', i.[Service Period], w.[Work Date]),
DateAdd('m', i.[Service Period], i.[Purchase Date]))
) AS NextServiceDate, i.Equipement
FROM Inventory i LEFT JOIN WorkDone w ON i.ID = w.Equipment
GROUP BY i.Equipement
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.