2010-10-26 150 views
2

我有一個完整的大腦放屁時刻,所以我想我會問這裏。 我有3個表看起來像這樣的SQL查詢幫助

設備表

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

位置表

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

服務表

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

我需要一種方法要列出所有地點有一臺或多臺設備維修,但不是所有的設備地點已經提供服務。

因此,對於上面的例子,它將返回以下結果

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

感謝您的幫助!

回答

3

該查詢會給你你想要的位置狀態,雖然不是單個設備的狀態:

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 

添加逗號分隔已equipmentIds列表/不被服務到結果集,您將需要某種CONCAT功能。無論是UDF,CLR還是遞歸CTE(我現在沒有時間寫這個 - here's a link)。

+0

謝謝布拉德。這讓我走上了右腳! – zSynopsis 2010-10-27 20:58:53