2013-06-26 38 views
0

我已经花了很大一部分时间浏览本网站和其他许多人,并且还没有找到解决我的问题的方法。聚合函数中的多行

我目前正在运行的MS Access中的查询,将拉动下面的列:

的问题是我需要的里程碑是最近里程碑。 due_date对应于此里程碑。

每个里程碑都输入一个自动编号ID,我一直在试图用这个ID拉我的查询。

这个查询:

SELECT E.EID, E.[CN], E.[AN], E.Status, MAX(M.ID) AS Milestone_ID 
FROM [Pilot Milestone] AS M, [PP Engagements] AS E, [Pilot Milestone] AS D 
WHERE E.EID=M.EID 
GROUP BY M.EID, E.EID, E.[CN], E.[AN], E.Status, E.[Estimated Hours] 

令我对每个EID最近的一个里程碑ID。但是,如果我添加Due_Dates:

SELECT E.EID, E.[CN], E.[AN], E.Status, MAX(M.ID) AS Milestone_ID, M.(Due Date) 
FROM [Pilot Milestone] AS M, [PP Engagements] AS E, [Pilot Milestone] AS D 
WHERE E.EID=M.EID 
GROUP BY M.EID, E.EID, E.[CN], E.[AN], E.Status, E.[Estimated Hours], M.(Due Date) 

我收到EID 30两个额外的记录,这些都是只有两个记录,截止日期和既不反映最新里程碑ID。

此外,每个EID都有多个里程碑,因此如果我在查询中输入里程碑说明的方式与我的截止日期相同,我会遇到类似的问题。

任何帮助,非常感谢。

感谢

修订

下面的查询给我结果我due_dates没有任何重复,我只是在MS Access测试2007年但是,查询无论拉最近的日期,如果它是从最近的里程碑。

SELECT E.EID, E.[Client Name], E.[Audit Name], E.Status, MAX(M.ID) AS Milestone_ID, (
SELECT MAX ([Due Date]) FROM [Pilot Milestone] AS M2 WHERE M2.EID = M.EID) AS Due_Date 
FROM [Pilot Milestone] AS M, [Potential Pilot Engagements] AS E 
WHERE E.EID=M.EID 
GROUP BY M.EID, E.EID, E.[Client Name], E.[Audit Name], E.Status, E.[Estimated Hours] 

此外,我不能确定如何添加里程碑描述到的结果,而不要么将其添加为聚集函数(导致一式两份)或以导致多个记录子查询添加它的一部分,并且错误

SELECT E.EID, E.[Client Name], E.[Audit Name], E.Status, MAX(M.ID) AS Milestone_ID, (
SELECT MAX ([Due Date]) FROM [Pilot Milestone] AS M2 WHERE M2.EID = M.EID) AS Due_Date, (
SELECT (Milestone) FROM [Pilot Milestone] AS M3 WHERE M3.EID = M.EID) AS Milestone 
FROM [Pilot Milestone] AS M, [Potential Pilot Engagements] AS E 
WHERE E.EID=M.EID 
GROUP BY M.EID, E.EID, E.[Client Name], E.[Audit Name], E.Status, E.[Estimated Hours] 
+1

最近的截止日期以及最近Milestone_IDs的名单,除非你添加一个条件,你由于'D'引用'Pilot Milestone',因此获得笛卡尔产品。由于“GROUP BY”的原因,这是不可见的,但是会在性能上花费你的时间(尤其是当你没有使用该参考时)。这就是为什么你应该总是明确限定你的连接,而不是使用隐式(以逗号分隔的''''''子句)语法。显示源表格/样本数据和期望的结果可能会帮助我们帮助您,您使用的Access版本也会有所帮助。你也不应该由'M.EID'和'E.EID'组合,因为它们对于给定的行是相同的。 –

+0

谢谢,我无意中在这里写下了查询,同时查看了记事本的错误部分,导致了Pilot Milestone AS D错误。我只是从Access(2007)现在复制 –

回答

0

该查询会给你为每个Milestone_ID

SELECT 
    E.[EID], E.[CN], E.[AN], M.[Milestone], E.[Status], MAX(M.[ID]) AS Milestone_ID, (
     SELECT MAX([Due Date]) FROM [Pilot Milestone] AS M2 WHERE M2.[ID]=MAX(M.[ID]) AND M2.[EID]=M.[EID] 
     ) as Due_Date 
FROM 
    [Pilot Milestone] AS M 
    INNER JOIN [PP Engagements] AS E ON E.[EID]=M.[EID] 
GROUP BY E.[EID], E.[CN], E.[AN], M.[Milestone], E.[Status] 
+0

不,M.ID给我最近的里程碑。问题是我必须包括M.在我的查询里程碑。因此,尽管上面列出的第一个查询准确地为我提供了Milestone ID中最新里程碑的参考,但是如果将Milestone添加到我的SELECT语句中,它会为每个EID取得每个里程碑,而我只需要最近一次。 –

+0

@Ianclark我根据你的评论编辑了我的答案。请重新测试。 – DaVinci007

+0

谢谢!我能够从中编写查询,以便在没有任何重复的情况下提交到期日期。但是,一个问题是,如果当前较少的里程碑具有较晚的due_date,则会拖延较晚的,不准确的日期。你偶然知道我会如何去解决这个问题和/或能够拉动里程碑描述吗?我修改了我原来的问题。再次感谢! –