在 MS Access SQL 查询中组合行
Combining Rows in MS Access SQL Query
下面是 MS Access 中查询的屏幕截图。我试图将两个 "Kim Wong" 行合并为一行,其中一个时间范围在 Monday
列中,另一个时间范围在 Tuesday
列中。完成后每个单元格中都会有时间范围。
查询如下所示。
这是实际代码
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])));
这是 tblEmployees
的示例。
这里是qryEmployed
。
这里是 tblEvents
。
很难根据访问在您的实际 sql 中抛出的所有内容来判断,但我相信您会遇到此问题,因为您是从事件 [=15] 开始查询的=] 然后加入 qryEmployed table。以这种方式加入会创建两行,因为 Kim Wong 被分配到两个不同的事件,因此她的名字被输入到两个不同的行中。首先,您需要从 table 中删除 Event 列,这可能会修复它。
如果您可以显示返回的整个 table 或至少 table 的查询,这将大大有助于进一步诊断要更改的内容。
我同意 hdizzle 的观点,您的查询非常难以阅读,因为它似乎是从 MS Access GUI 生成的。我强烈建议您避免使用 GUI 并直接学习 SQL 语法。
您的查询本质上是在 return 多个值之间进行聚合(如果每个人每天都有一个值)。您需要 'group by' 所有 return 未聚合的列。
我稍微重新设置了查询格式,并删除了所有我认为无用的无关 GROUP BY 子句。然后我向每个 'DayOfTheWeek' return 列添加了一个聚合子句。如果事件发生,下面的查询应该 return 个人事件发生的时间,或者它应该 return 空白。如果发生多个事件,它将 return 按字母顺序排在最后一个(您从未解释过您希望如何处理该场景)。
此外,您 link 在名称字段上,我强烈建议您 link 在 ID 字段上。名称更改相对频繁,我相当确定 link 使用整数具有更好的性能。
试试
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
下面是 MS Access 中查询的屏幕截图。我试图将两个 "Kim Wong" 行合并为一行,其中一个时间范围在 Monday
列中,另一个时间范围在 Tuesday
列中。完成后每个单元格中都会有时间范围。
查询如下所示。
这是实际代码
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])));
这是 tblEmployees
的示例。
这里是qryEmployed
。
这里是 tblEvents
。
很难根据访问在您的实际 sql 中抛出的所有内容来判断,但我相信您会遇到此问题,因为您是从事件 [=15] 开始查询的=] 然后加入 qryEmployed table。以这种方式加入会创建两行,因为 Kim Wong 被分配到两个不同的事件,因此她的名字被输入到两个不同的行中。首先,您需要从 table 中删除 Event 列,这可能会修复它。
如果您可以显示返回的整个 table 或至少 table 的查询,这将大大有助于进一步诊断要更改的内容。
我同意 hdizzle 的观点,您的查询非常难以阅读,因为它似乎是从 MS Access GUI 生成的。我强烈建议您避免使用 GUI 并直接学习 SQL 语法。
您的查询本质上是在 return 多个值之间进行聚合(如果每个人每天都有一个值)。您需要 'group by' 所有 return 未聚合的列。
我稍微重新设置了查询格式,并删除了所有我认为无用的无关 GROUP BY 子句。然后我向每个 'DayOfTheWeek' return 列添加了一个聚合子句。如果事件发生,下面的查询应该 return 个人事件发生的时间,或者它应该 return 空白。如果发生多个事件,它将 return 按字母顺序排在最后一个(您从未解释过您希望如何处理该场景)。
此外,您 link 在名称字段上,我强烈建议您 link 在 ID 字段上。名称更改相对频繁,我相当确定 link 使用整数具有更好的性能。
试试
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