Ms access SQL/MS Access-在数据集中查找高峰/非高峰天数

Ms access SQL/MS Access-在数据集中查找高峰/非高峰天数,ms-access,switch-statement,iif,Ms Access,Switch Statement,Iif,我的数据集如下所示(但显然要大得多): 日期-----------------客户------------输出 2016年1月1日01:00------4------5 2016年1月1日03:00-----------------5-----------------20 2016年2月1日09:00-----------------4-----------------10 2016年4月1日06:00-----------------5-----------------5 2016年6月1日1

我的数据集如下所示(但显然要大得多):

日期-----------------客户------------输出
2016年1月1日01:00------4------5
2016年1月1日03:00-----------------5-----------------20
2016年2月1日09:00-----------------4-----------------10
2016年4月1日06:00-----------------5-----------------5
2016年6月1日13:00-----------------4-----------------10
2016年11月1日23:00------5------25
2016年10月2日12:00-----------------5-----------------15
2016年10月2日24:00-----------------4-----------------25
2016年2月14日16:00-----------------4-----------------10
2016年2月16日04:00------5------5
2016年2月14日16:00-----------------5-----------------10
2016年2月16日04:00------4------5
2016年2月18日16:00------5------10
2016年2月19日12:00--------4--------5

我需要一个执行以下操作的查询:
1) 能够判断日期是在高峰时间还是非高峰时间,这意味着它是假日还是在一周或一周内
2) 如果是工作日,则必须能够在高峰/非高峰时段按小时进一步细分(1-7和24为非高峰时段,8-23为高峰时段)
3) 能够每月和平均将所有这些集中在一起

基本上是这样的:

月------客户------年------平均高峰------平均非高峰
1-------4-------2016-------10------------7.5
1-----------------5-------2016-----------------25-----------------12.5
2-----------------4-----------------2016-----------------15-----------------7.5
2-----------------5-----------------2016-----------------12.5-----------------12.5

我有一个可从Excel访问的链接表。数据从在线数据库下载并存储在excel中(但最好存储在Access LMK中)

我尝试了一个switch语句:

参考[Hrly_Daily_Monthly 2]是一个表,它将日期时间从开始日期分为月、小时、年等

[非高峰日]是所有假日的表格

Switch(
[Hrly_Daily_Monthly 2].Date=#1/1/2016#, "off-peak day",
[Hrly_Daily_Monthly 2].Date=#5/30/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#7/4/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#9/5/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Date=#11/24/2016# , "off-peak day",
[Hrly_Daily_Monthly 2].Day = 1, "off-peak day",
[Hrly_Daily_Monthly 2].Day = 7, "off-peak day",

TRUE, "on-peak day") AS [On/Off Day]
由于语句太多而获取错误

我还尝试创建多个查询,而不是一个查询,然后使用Make表将所有查询放在一起。它严重地减慢了数据库的速度

非高峰日查询AKA[非高峰日2]表

SELECT [Hrly_Daily_Monthly 2].datetime_beginning_ept, [Hrly_Daily_Monthly 2].output, [Hrly_Daily_Monthly 2].cust, [Hrly_Daily_Monthly 2].Date
FROM [Hrly_Daily_Monthly 2], [Off peak list]
WHERE ([Hrly_Daily_Monthly 2].datetime_beginning_ept=[Off-peak days] OR [Day] NOT BETWEEN 2 and 6);
高峰日查询(取决于非高峰查询)


非常感谢您的帮助

请注意,在访问日期/时间字段中,午夜是0小时

考虑此查询,该查询将数据表与非高峰工作日关联,并计算日期部分和非高峰系数:

SELECT datetime_beginning_ept, Customer, Output, Dt, Hr, Wd, Mo, Yr, OffPeakDays.HolDate, 
       IIf([Dt]=[HolDate] Or [Wd]<3 Or [Hr]<8, False, True) AS OnPeak
FROM OffPeakDays 
RIGHT JOIN 
    (SELECT datetime_beginning_ept, Customer, Output, DateValue([datetime_beginning_ept]) AS Dt, 
     Hour([datetime_beginning_ept]) AS Hr, WeekDay([datetime_beginning_ept],7) AS Wd, 
     Month([datetime_beginning_ept]) AS Mo, Year([datetime_beginning_ept]) AS Yr
     FROM DataTable) AS [Hrly_Daily_Monthly 2] 
ON OffPeakDays.HolDate = [Hrly_Daily_Monthly 2].Dt;

为什么在Access中存储数据不是更好?需要为查询中引用的每个数据集提供示例数据。该数据已作为excel文件下载,因此只需按此方式进行配置即可。所以我们可以说[Hrly_daily_monthly]与我创建的包含日期、客户和输出的表相同。忽略上面说的[SESA hrly_daly_monthly]。两者都是一样的,想把它简单化,却忘了把它统一起来。[Off-peak days]表如下所示:Off-peak list 1/1/2016 7/4/2016 12/25/2016(等等),那么为什么要将其保留为Excel而不是导入Access?这是定期下载吗?它是累积的还是仅仅是新的信息?所以我必须每周更新一次文件。理想情况下,我会链接表,然后更新所有查询/表。这是一个导入的文件,希望我理解正确。对于所有这些都很陌生,遗憾的是,第一个查询不起作用:(IIf语句基本上看第一个true语句,然后忽略其余语句。它在我的查询中起作用。重新确认。在我的测试中,IIf()计算正确,只有一条记录符合“峰值”条件。
SELECT datetime_beginning_ept, Customer, Output, Dt, Hr, Wd, Mo, Yr, OffPeakDays.HolDate, 
       IIf([Dt]=[HolDate] Or [Wd]<3 Or [Hr]<8, False, True) AS OnPeak
FROM OffPeakDays 
RIGHT JOIN 
    (SELECT datetime_beginning_ept, Customer, Output, DateValue([datetime_beginning_ept]) AS Dt, 
     Hour([datetime_beginning_ept]) AS Hr, WeekDay([datetime_beginning_ept],7) AS Wd, 
     Month([datetime_beginning_ept]) AS Mo, Year([datetime_beginning_ept]) AS Yr
     FROM DataTable) AS [Hrly_Daily_Monthly 2] 
ON OffPeakDays.HolDate = [Hrly_Daily_Monthly 2].Dt;
SELECT qryDateCalcs.Mo, qryDateCalcs.Customer, qryDateCalcs.Yr, 
     Avg(IIf([OnPeak],[Output],Null)) AS AvgOnPeak, 
     Avg(IIf(Not [OnPeak],[Output],Null)) AS AvgOffPeak
FROM qryDateCalcs
GROUP BY qryDateCalcs.Mo, qryDateCalcs.Customer, qryDateCalcs.Yr;