MS Access / SQL子查询的语法,包括聚合函数

时间:2018-03-30 14:49:06

标签: sql ms-access

我正在尝试生成一个数据库来管理设备的维护。我有两张桌子:

  1. 一个(库存)包含每件设备的详细信息,包括购买日期服务期
  2. 其中一个包含已完成工作的详细信息( WorkDone ),包括工作执行的日期(工作日期)。
  3. 我想要一个显示下次应该提供服务的日期的查询。到目前为止,我有:

    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的答案:Is there a Max function in SQL Server that takes two values like Math.Max in .NET?。但我不断收到错误,说查询不是聚合函数的一部分,我不确定我做错了什么。例如,我试过:

    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
    

    有一些语法错误。

2 个答案:

答案 0 :(得分:1)

您不必比较这两个日期,只需检查是否存在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

您的查询的其余部分可以保持原样。

答案 1 :(得分:1)

考虑style返回匹配或不匹配的记录,其中后者填充NULL,然后使用NZ()运行汇总LEFT JOIN

MAX
相关问题