Le titre peut prêter à confusion.

J'ai un tableau des cas, et chaque cas peut contenir de nombreuses tâches. Pour réaliser un flux de travail différent pour chaque tâche, j'ai différentes tables telles que Case_Emails, Case_Calls, Case_Chats, etc ...

Je souhaite créer une requête qui sera éventuellement exportée vers Excel. Dans cette requête, je veux lister chaque tâche, et les tâches sont déjà jointes via une UNION dans une autre table en utilisant un format commun. Pour chaque tâche de la requête, je souhaite que seule la première tâche associée à un cas inclue les détails du tableau Cas. Exemple ci-dessous:

+----+---------+------------+-------------+-------------+-------------+
| 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    |
+----+---------+------------+-------------+-------------+-------------+

Mon approche originale tentait une jointure à gauche sur l'ID de cas, mais je ne savais pas comment filtrer les données des lignes supplémentaires.

0
user820304 21 avril 2017 à 18:34

3 réponses

Meilleure réponse

J'ai découvert que je peux nommer mes tables dans la requête comme suit:

FROM Case_Calls Calls

Avec cet autre nom, j'ai pu filtrer en fonction d'une sous-requête:

IIF( Calls.[ID] <> (select top 1 [ID] from Case_Calls where [Case ID] = Calls.[Case ID]), '', Cases.[Creator]) As [Case Creator]

Cette solution me donne les résultats que je veux :) C'est un SQL assez moche, et difficile à analyser quand j'ai affaire à des dizaines de colonnes, mais ça fait le boulot!

Je suis toujours curieux de savoir s'il existe une meilleure solution ...

0
user820304user820304 21 avril 2017 à 17:08

Ce serait beaucoup plus simple si Access prenait en charge la fonction ROW_NUMBER. Ce n'est pas le cas, mais vous pouvez en quelque sorte le simuler avec une sous-requête corrélée à l'aide de la table Tâches (cela suppose que chaque tâche a un ID numérique unique). Cela affecte essentiellement un numéro de ligne à chaque tâche, partitionné par le CaseID. Ensuite, vous pouvez simplement afficher conditionnellement le CaseID et AgentName où 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
)

Vous n'avez pas publié la structure de votre table, donc je ne suis pas sûr que cela fonctionnera pour vous tel quel, mais peut-être que vous pouvez l'adapter.

1
Jerrad 21 avril 2017 à 17:26

Quoi qu'il en soit, lorsque vous vous inscrivez, vous aurez des valeurs en double. pour supprimer les doublons, insérez un Distinct dans votre sélection ou un Group by après vos filtres. Cela devrait résoudre les doublons dans votre requête d'informations sur les tâches 1, 2, 3.

0
Tdubs 21 avril 2017 à 16:02