2014-12-03 73 views
0

以下是我的查詢:評估的&&條件僅對行匹配次

SELECT DISTINCT 
       SC.Feature, 
       CASE WHEN SA.Target > ANY(SELECT SA.Availability) THEN 0 ELSE 1 END AS IsAvailable, 
       SA.Date AS DateTime 

FROM   dbo.ServiceAvailability AS SA LEFT OUTER JOIN 
       dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID 

我的輸出最終被這種形式:

Feature IsAvailable DateTime 
------------------------------------------------- 
    F1   0   2014-11-01 07:00:00.000 
    F1   1   2014-11-01 07:00:00.000 

如何將我的查詢更改爲AND輸出這樣,我會反而把這兩行合併到下面?

Feature IsAvailable DateTime 
------------------------------------------------- 
    F1   0   2014-11-01 07:00:00.000 

編輯:如果IsAvailable值都爲1,當然他們都AND並結合給兩個操作數之間IsAvailable = 1

+0

如何在兩行合併爲一個,並有IsAvailable = 0? – Jt2ouan 2014-12-03 01:10:59

回答

1

我認爲這應該工作:

SELECT 
       SC.Feature, 
       CASE WHEN sum(
         CASE WHEN SA.Target > ANY(SELECT SA.Availability) 
          THEN 1 
          ELSE 0 
         END) >= 1 
        THEN 0 
        ELSE 1 
       END AS IsAvailable, 
       SA.Date AS DateTime 

FROM   dbo.ServiceAvailability AS SA 
LEFT JOIN  dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID 
GROUP BY  SC.Feature, 
       SA.Date 

我顛倒內CASE語句所以0現在1,反之亦然。然後,我們可以按照您的組列列出總和,如果總和大於或等於1,則至少有一個1(實際上是0!),因此運算結果爲0;否則它們都是0(實際上是1),結果應該是1

編輯:迴應「無法對包含聚合或子查詢的表達式執行聚合函數」 - 我沒有意識到這是一個限制。我重新安排了查詢以首先執行子查詢,然後對該數據集進行分組。希望這有效。我認爲現在發生的事情也更清楚一些。

SELECT 
    Feature, 
    CASE WHEN sum(IsNotAvailable) >= 1 
     THEN 0 
     ELSE 1 
    END AS IsAvailable, 
    [DateTime] 
FROM (
    SELECT  
        SC.Feature,     
        CASE WHEN SA.Target > ANY(SELECT SA.Availability) 
         THEN 1 
         ELSE 0 
        END AS IsNotAvailable, 
        SA.Date AS DateTime  
    FROM   dbo.ServiceAvailability AS SA 
    LEFT JOIN  dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID 
) x 
GROUP BY  x.Feature, 
       x.[DateTime] 
+0

這對我有意義。然而,它吐出了錯誤「不能對包含聚集或子查詢的表達式執行聚合函數」。 – wemblem 2014-12-03 01:03:49

+0

@wemblem好的,請看我的編輯。 – Blorgbeard 2014-12-03 01:11:11

+0

工程就像一個魅力!謝謝! – wemblem 2014-12-03 01:14:25

0

單行如果只有一個操作數的值是結果將是 所以我認爲這將解決您的問題:

select distinct * 
from (SELECT DISTINCT 
      SC.Feature, 
      CASE WHEN SA.Target > ANY(SELECT SA.Availability) THEN 0 ELSE 1 EN 
IsAvailable, 
      SA.Date AS DateTime 

FROM   dbo.ServiceAvailability AS SA LEFT OUTER JOIN 
      dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID) 
where IsAvailable=0 
+1

儘管如此,這不會返回任何IsAvailable爲1的情況。 – wemblem 2014-12-03 01:02:34

0

試試這個,它從原來的查詢選擇不同的行

select distinct * 
from (SELECT 
     SC.Feature, 
     CASE WHEN SA.Target > ANY(SELECT SA.Availability) THEN 0 ELSE 1 EN 
IsAvailable, 
     SA.Date AS DateTime 

FROM   dbo.ServiceAvailability AS SA LEFT OUTER JOIN 
     dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID) 
+0

這不會改變我的輸出。 – wemblem 2014-12-03 01:12:59