另一个团队拥有一个用于跟踪通话记录的Access数据库。它非常基础,实际上只是一个包含少量查找的表,它们直接在数据表视图中输入数据。他们已经让我帮忙写一份报告来按周和理由总结他们的电话,我对这个问题感到很难过,因为我不是任何人都可以接触。
数据库由两个核心表组成,一个包含调用日志条目(Calls),另一个包含调用原因查找列表(ReasonsLookup)。相关的表结构是:
Calls
-----
ID (autonumber, PK)
DateLogged (datetime)
Reason (int, FK to ReasonLookup.ID)
Reason 2 (int, FK to ReasonLookup.ID)
ReasonLookup
------------
ID (autonumber PK)
Reason (text)
他们想要的是一份如下所示的报告:
WeekNum Reason Total
------- ---------- -----
10 Eligibility Request 24
10 Extension Request 43
10 Information Question 97
11 Eligibility Request 35
11 Information Question 154
... ... etc ...
我的问题是Calls表中有两列,因为他们想记录接收呼叫的主要和次要原因,即有人呼叫原因A而在电话上也请求理由B. call将有一个主要原因列值(Calls.Reason not null)但不一定是次要原因列值(Calls。[Reason 2]通常为null)。
对于每个WeekNum,他们想要的是每个可能的Reason的单个(不同)条目,以及中使用 Calls.Reason或Calls的Reason的总数。 [原因2]该周的列。因此,在上面的资格申请示例中,他们希望查看本周资格申请的一个条目,并计算具有Calls.Reason =资格请求或呼叫的那一周的呼叫中的每个记录。[原因2] =资格请求。
接近将如上所示显示的查询的最佳方法是什么?理想情况下,这是一个直接查询,不需要VBA。它们是非技术性的,因此如果可能的话,更简单,更容易维护。
提前致谢,任何帮助都非常感谢。
答案 0 :(得分:2)
"正常"方法是使用union all
查询作为子查询来创建一组周和原因,但是Access并不支持这一点,但是您可以做的应该是首先定义要创建的查询联合然后使用该查询作为" main"的来源。查询。
所以第一个查询将是
SELECT datepart("ww",datelogged) as week, Reason from calls
UNION ALL
SELECT datepart("ww",datelogged), [Reason 2] from calls;
将其另存为UnionQuery
并进行另一次查询mainQuery
:
SELECT uq.week, rl.reason, Count(*) AS Total
FROM UnionQuery AS uq
INNER JOIN reasonlookup AS rl ON uq.reason = rl.id
GROUP BY uq.week, rl.reason;
答案 1 :(得分:0)
您可以使用联合查询为Reason和Reason 2附加单个Group By Aggregate查询:
SELECT DatePart("ww", Calls.DateLogged) As WeekNum, ReasonLookup.Reason,
Sum(Calls.ID) As [Total]
FROM Calls
INNER JOIN Calls.Reason = ReasonLookup.ID
GROUP BY DatePart("ww", Calls.DateLogged) As WeekNum, ReasonLookup.Reason;
UNION
SELECT DatePart("ww", Calls.DateLogged) As WeekNum, ReasonLookup.Reason,
Sum(Calls.ID) As [Total]
FROM Calls
INNER JOIN Calls.[Reason 2] = ReasonLookup.ID
GROUP BY DatePart("ww", Calls.DateLogged) As WeekNum, ReasonLookup.Reason;
DatePart()输出日历年中特定日期的周数。此外,与UNION
相对的UNION ALL
可防止出现重复的行。