标题可能令人困惑。
我有一个案例表,每个案例可以包含许多任务。为了实现每个任务的不同工作流程,我有不同的表,如Case_Emails,Case_Calls,Case_Chats等......
我想构建一个最终导出到Excel的Query。在此查询中,我想列出每个任务,并且任务已经使用通用格式通过另一个表中的UNION连接在一起。对于Query中的每个任务,我只希望与案例关联的第一个任务包含Cases表中的详细信息。示例如下:
+----+---------+------------+-------------+-------------+-------------+
| id | Case ID | Agent Name | Task Info 1 | Task Info 2 | Task Info 3 |
+----+---------+------------+-------------+-------------+-------------+
| 1 | 4000000 | Some Name | Detailstuff | Stuffdetail | Thingsyo |
| 2 | | | Detailstuff | Stuffdetail | Thingsyo |
| 3 | | | Detailstuff | Stuffdetail | Thingsyo |
| 4 | 4000003 | Some Name | Detailstuff | Stuffdetail | Thingsyo |
| 5 | | | Detailstuff | Stuffdetail | Thingsyo |
| 6 | 4000006 | Some Name | Detailstuff | Stuffdetail | Thingsyo |
+----+---------+------------+-------------+-------------+-------------+
我原来的方法是尝试对案例ID进行LEFT JOIN,但我无法弄清楚如何从额外的行中过滤掉数据。
答案 0 :(得分:1)
如果Access支持ROW_NUMBER
功能,这将更加简单。它没有,但您可以使用Tasks表(使用Tasks表假设每个任务具有唯一的数字ID)来使用相关子查询对其进行模拟。这基本上为每个任务分配一个行号,由CaseID分区。然后,您可以有条件地显示CaseID和AgentName,其中RowNum = 1
。
SELECT Switch(RowNum = 1, CaseID) as Case,
Switch(RowNum = 1, AgentName) as Agent,
TaskName
FROM (
SELECT c.CaseID,
c.AgentName,
t.TaskName,
(select count(*)
from Tasks t2
where t2.CaseID = c.CaseID and t2.ID <= t.ID) as RowNum
FROM Cases c
INNER JOIN Tasks t ON c.CaseID = t.CaseID
order by c.CaseID, t.TaskName
)
你没有发布你的桌面结构,所以我不确定这对你是否有用,但也许你可以适应它。
答案 1 :(得分:0)
无论您何时加入,都会有重复的值。删除重复项,或者在您的选择中放入Distinct,或者在过滤器后放入Group。这应解决您查询任务信息1,2,3中的重复项。
答案 2 :(得分:0)
发现我可以在查询中命名我的表,如下所示:
FROM Case_Calls Calls
使用这个其他名称,我能够根据子查询进行过滤:
IIF( Calls.[ID] <> (select top 1 [ID] from Case_Calls where [Case ID] = Calls.[Case ID]), '', Cases.[Creator]) As [Case Creator]
这个解决方案给了我想要的结果:)它是相当丑陋的SQL,当我处理几十列时难以解析,但它完成了工作!
如果有更好的解决方案,我仍然很好奇......