2010-10-26 6 views
2

Je vais avoir un moment de pet de cerveau complet alors j'ai pensé que je demanderais loin ici. J'ai 3 tables qui ressemblent à ceAide à la requête SQL

Équipement Tableau

EquipmentID | LocationID 
------------------------- 
1   | 2 
2   | 2 
3   | 1 
4   | 2 
5   | 3 
6   | 3 

Table Emplacement

LocationID | LocationName 
-------------------------- 
1   | Pizza Hut 
2   | Giordanos 
3   | Lou Malnati's 

service Tableau

LocationID | EquipmentID | Status 
----------------------------------- 
2   | 1   | Serviced 
2   | 2   | Not Yet Serviced 
2   | 4   | Not Yet Serviced 
3   | 5   | Serviced 

Je besoin d'un moyen d'énumérer tous les lieux qui ont avait un ou plusieurs équipements entretenus, mais pas tous les équipements à la l'emplacement a été entretenu encore.

Donc, pour l'exemple ci-dessus renvoie alors les résultats suivants

LocationID | ServicedEquipmentID | NotServicedEquipmentIDS | LocationStatus 
------------------------------------------------------------------------------ 
2   | 1     | 2, 4      | Partially Serviced 
3   | 5     | 6       | Partially Serviced 

Merci pour toute aide!

Répondre

3

Cette requête vous donnera l'état de l'emplacement que vous désirez, mais pas les statuts de l'équipement individuel:

SELECT [LocationId] 
     ,[LocationId] 
     ,CASE ([IsServiced] + [IsNotServiced]) 
      WHEN 0 THEN 'Not Serviced' 
      WHEN 1 THEN 'Partially Serviced' 
      WHEN 2 THEN 'Serviced' 
     END [LocationStatus] 
FROM (SELECT [l].[LocationId] 
        ,[e].[LocationId] 
        ,CASE [s].[Status] 
         WHEN 'Serviced' THEN 1 
         ELSE 0 
        END [IsServiced] 
        ,CASE [s].[Status] 
         WHEN 'Not Yet Serviced' THEN 1 
         ELSE 0 
        END [IsNotServiced] 
      FROM  [Location] l 
        INNER JOIN [Equipment] e ON [l].[LocationId] = [e].[LocationId] 
        INNER JOIN [Service] s ON [l].[LocationId] = [s].[LocationId] 
               AND [e].[EquipmentId] = [s].[EquipmentId] 
     ) x 

Pour ajouter une liste seperated par des virgules equipmentIds qui ont été/non desservies à l'ensemble des résultats, vous aurez besoin d'une fonction CONCAT de quelque sorte. Soit un UDF, CLR ou un CTE récursif (je n'ai pas le temps d'écrire cela maintenant - here's a link).

+0

Merci brad. Cela m'a fait du bon pied! – zSynopsis