2014-12-03 75 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