查询 MS Access 多个条件(where)
Posted
技术标签:
【中文标题】查询 MS Access 多个条件(where)【英文标题】:Query MS Access multiple condition (where) 【发布时间】:2017-12-25 13:11:17 【问题描述】:我有这个数据:
*周、年、数值为数字格式
我正在尝试获取过去 5 周的平均值:5,000(即 25,000/5)
到目前为止我有这个查询
x=用户输入/获取当年上周(当前周) y= 当前日期,年份
INSERT INTO RR5 ([ID],[RR5])
SELECT ID, ROUND((SUM(AMOUNT)/5),4) AS RR5
FROM resultTable
WHERE Years =" & y - 1 & " and Week > " & 52 - (x - 5) & " Group BY ID"
但是,我只能得到第 51 周和第 52 周。我需要添加附加条件来告诉编译器我需要周 > 2016 年 50 年和周
Years = " & y & " and Weeknum < " & x
获得第 1 周第 2 周和第 3 周。
我认为我不能将这两个条件放在同一个“位置”中。我该如何解决?
解决方案:
INSERT INTO RR5 ([ID],[RR5]) SELECT ID, ROUND((SUM(AMOUNT)/5),4) AS RR5 FROM resultTable WHERE (Years = " & Y - 1 & " and WeekNum > 52 - (5-" & x & ")) OR ( Years = " & Y & " and Weeknum <= " & x & " ) Group BY ID
只需在每个条件上添加括号,然后用 OR 连接另一个条件。
感谢您的支持,希望对遇到同样问题的人有所帮助。
【问题讨论】:
请提供完整的代码,包括任何VBA,并包括字段类型。 点作为数据还是只是一个奇特的帖子?正如其他人所说,提供更多详细信息以提供更好的帮助。 抱歉,点表示1-52的连续数据。 【参考方案1】:您的问题根源在于您存储日期数据的方式。最好将其存储为实际日期,而不是年份和星期。但是,作为一种解决方法,您可以将现有的年份和星期转换为日期,然后在 where 子句中使用它。
WHERE (CDate("1 JAN " & Year) + (Week - 1) * 7) > (CDate("1 JAN " & y) + (x - 1) * 7)
这样做的目的是获取您拥有的每条记录并使用 CDate 函数将其转换为给定年份的 1 月 1 日。因为这些日期实际上存储为双精度数,其中 1 对应于 24 小时,所以我将添加到 1 月 1 日的日期,以找出随后一周的第一天是什么。 (Week - 1)
假设第一周从 1 月 1 日开始。
现在,您只需对用户提供的年 (y) 和周 (x) 使用相同的逻辑。查询将返回晚于用户指定日期发生的任何内容。
【讨论】:
您好 SandPiper,感谢您的意见。我也认为如果我们可以使用公历会很容易。不幸的是,这些数据来自 BW,最初是每周使用这种格式定义的(例如:1#2016,2#2016,.. 52#2016,1#2017)。 (对不起,我不是母语英语,但我想你明白了。)【参考方案2】:你可以使用:
INSERT INTO RR5 ([ID],[RR5])
SELECT ID, ROUND((SUM(AMOUNT)/5),4) AS RR5
FROM
(SELECT TOP 5 *
FROM resultTable
WHERE Years * 100 + WeekNum <= SelectedYear * 100 + SelectedWeek
ORDER BY Years Desc, WeekNum Desc)
【讨论】:
如果他只想要最后 5 行,这将起作用。我的印象是他希望用户输入开始的年份/周并在此之后获得所有内容。在这种特殊情况下,用户想要最后 5 周。但是,如果用户想要过去 8 周怎么办? @SandPiper 确切地说,我需要开始的一周以及之后的一切。但它总是会持续 5 周,唯一改变的是本周。 我很困惑。您写道 我正在尝试获取过去 5 周的平均值 - 这就是我的解决方案所提供的。如果“当前”周既不是当前周也不是最后一周,只需过滤这个选定的年/周。请查看编辑后的答案。以上是关于查询 MS Access 多个条件(where)的主要内容,如果未能解决你的问题,请参考以下文章
MS Access SQL 多个 JOIN 和 WHERE 子句
MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢