加入两个表,但只包括每个唯一记录的第一个实例中第一个表的数据

时间:2017-04-21 15:35:00

标签: sql ms-access

标题可能令人困惑。

我有一个案例表,每个案例可以包含许多任务。为了实现每个任务的不同工作流程,我有不同的表,如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,但我无法弄清楚如何从额外的行中过滤掉数据。

3 个答案:

答案 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,当我处理几十列时难以解析,但它完成了工作!

如果有更好的解决方案,我仍然很好奇......