在MS Access SQL查询中合并行

在MS Access SQL查询中合并行,sql,ms-access,grouping,Sql,Ms Access,Grouping,下面是MS Access中一个查询的屏幕截图。我试图将两个“Kim Wong”行合并为一行,其中一个时间范围在Monday列中,另一个时间范围在周二列中。完成后,每个单元格中都会有时间范围 下面是查询的样子 这是实际的代码 SELECT qryEmployed.EmployeeName, First(IIf([EventDate]=DateAdd("d",0,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([Star

下面是MS Access中一个查询的屏幕截图。我试图将两个“Kim Wong”行合并为一行,其中一个时间范围在
Monday
列中,另一个时间范围在
周二
列中。完成后,每个单元格中都会有时间范围

下面是查询的样子

这是实际的代码

SELECT qryEmployed.EmployeeName, First(IIf([EventDate]=DateAdd("d",0,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Monday, First(IIf([EventDate]=DateAdd("d",1,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Tuesday, First(IIf([EventDate]=DateAdd("d",2,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Wednesday, First(IIf([EventDate]=DateAdd("d",3,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Thursday, First(IIf([EventDate]=DateAdd("d",4,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Friday, First(IIf([EventDate]=DateAdd("d",5,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Saturday, First(IIf([EventDate]=DateAdd("d",6,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")) AS Sunday
FROM tblEvents INNER JOIN qryEmployed ON tblEvents.Employee = qryEmployed.EmployeeName
GROUP BY qryEmployed.EmployeeName, qryEmployed.Position, tblEvents.Event, tblEvents.EventDate, tblEvents.StartTime, tblEvents.EndTime, tblEvents.Lunch, IIf([Event]="Scheduled",((IIf([EndTime]<[StartTime],1,0)+[EndTime])-[StartTime]-IIf([Lunch],1/48,0))*24,0)
HAVING (((tblEvents.EventDate)=DateAdd("d",0,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",1,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",2,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",3,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",4,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",5,[Forms]![tblEvents]![tbxDate]))) OR (((tblEvents.EventDate)=DateAdd("d",6,[Forms]![tblEvents]![tbxDate])));
选择qryEmployed.EmployeeName,第一个(IIf([EventDate]=日期添加(“d”,0,[表格]![tblEvents]![tbxDate]),IIf([EventDate]=“计划的”,格式([StartTime],“h:nn”)和“-”格式([EndTime],[Event]),“)作为星期一,第一个(IIf([EventDate]=日期添加(“d”,1,[Forms]![tblEvents]![tblEvents]![tbxDate]),格式([StartTime],“h:nn”),“)格式([EndTime],“h:nn”),[Event]),“”)为周二,第一个(IIf([EventDate]=日期添加(“d”,2,[Forms]![tblEvents]![tbxDate]),IIf([Event]=“Scheduled”,格式([StartTime],“h:nn”)和“-”格式([EndTime],“h:nn”),[Event]),“”)为周三,第一个(IIf([EventDate]=日期添加(“d”,3,[Forms]![tblEvents]![tbxDate]),IIf([Event]=“Scheduled”),格式([StartTime],[StartTime],[StartTime]),“h:nn”和“-”格式([EndTime],“h:nn”),[Event]),“,”)为星期四,第一个(IIf([EventDate]=DateAdd(“d”,4,[Forms]![tbxDate]![tbxDate]),IIf([Event]=“Scheduled”,格式([StartTime],“h:nn”)和“-”格式([EndTime],“h:nn”),[Event]),“)为星期五,第一个(IIf([EventDate日期]=DateAdd(“d”,5,[Forms]![tbxDate],[tbdate],[tbuted],[Event],[Event],“Scheduled]),格式”)([开始时间],“h:nn”)和“-”格式([结束时间],“h:nn”),[事件],”)作为星期六,第一个(IIf([事件日期]=日期添加(“d”,6,[表格]![tblEvents]![tbxDate]),IIf([事件]=“预定的”,格式([开始时间],“h:nn”)和“-”格式([结束时间],“h:nn”),[事件],”)作为星期天
从tblEvents内部连接tblEvents.Employee=qryEmployed.EmployeeName上的qryEmployed

按qryEmployed.EmployeeName、qryEmployed.Position、tLevents.Event、tLevents.EventDate、tLevents.StartTime、tLevents.EndTime、tLevents.午餐分组,IIf([Event]=“Scheduled”,([EndTime]根据access在实际sql中抛出的所有问题,有点难以判断,但我相信您会遇到这个问题,因为您是从事件表开始查询,然后加入qryEmployed表。以这种方式加入是创建两行,因为Kim Wong被分配给两个不同的事件,因此她的名字被输入到两个不同的行中。您需要从表中删除事件列作为开始,这可能会修复它


如果您可以显示返回的整个表或至少查询表,这将大大有助于进一步诊断要更改的内容。

我同意hdizzle,您的查询非常难以读取,因为它似乎是从MS Access GUI生成的。我强烈建议您避免使用GUI,直接学习SQL语法

您的查询本质上是在多个值之间聚合,如果每个人每天都有一个值,则返回多个值。您需要“分组”所有未聚合的返回列

我重新设置了查询的格式,删除了所有我认为不起任何作用的无关GROUP BY子句。然后,我在每个“DayOfWeek”返回列中添加了一个聚合子句。下面的查询应该返回单个事件发生的时间(如果事件发生),或者应该返回空白。如果发生多个事件,则将按字母顺序返回最后一个(您从未解释过希望如何处理该场景)

此外,如果您是在名称字段上进行链接,我强烈建议您在ID字段上进行链接。名称更改相对频繁,并且我相当确定在整数上进行链接具有更好的性能

试试像这样的东西

SELECT qryEmployed.EmployeeName, 
MAX(First(
    IIf(EventDate)]=DateAdd("d",0,[Forms]![tblEvents]![tbxDate]), IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Monday,
MAX(First(
    IIf([EventDate]=DateAdd("d",1,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Tuesday,
MAX(First(
    IIf([EventDate]=DateAdd("d",2,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Wednesday, 
MAX(First(
    IIf([EventDate]=DateAdd("d",3,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Thursday,
MAX(First(
    IIf([EventDate]=DateAdd("d",4,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Friday, 
MAX(First(
    IIf([EventDate]=DateAdd("d",5,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Saturday, 
MAX(First(
    IIf([EventDate]=DateAdd("d",6,[Forms]![tblEvents]![tbxDate]),IIf([Event]="Scheduled",Format([StartTime],"h:nn") & " - " & Format([EndTime],"h:nn"),[Event]),"")
)) AS Sunday
FROM tblEvents INNER JOIN qryEmployed ON tblEvents.Employee = qryEmployed.EmployeeName
GROUP BY 
qryEmployed.EmployeeName

删除事件列不起作用。显示整个表是什么意思?@Makai在没有看到实际数据或至少一些相同格式的样本数据的情况下,很难准确判断数据的情况。特别是因为您的查询中有一个GROUP BY satement。例如,我假设您在OyeName和Employee是1:很多是因为结果表的外观,但如果您不明确告诉我,或者我无法查看数据表的样本,则很难诊断发生了什么。这正是我需要的。我必须做一些小更改,但这是正确的。