2012-06-26 108 views
0

你怎么能Select两列,并且每列都测试它自己的条件而不是其他条件?在一条select语句中的不同条件

比方说,我有一个选择Count表中的每个记录。在一个专栏中,我希望从本周开始记录每一条记录,而在第二个专栏中,我希望自今年年初以来的所有记录。

我有两个条件,但它们都适用于特定的列:

 WHERE date BETWEEN @Monday AND @SUNDAY /* Weekly */ 
     WHERE date >= @JanuaryFirst    /* Annual */ 

但不能只是把它喜欢这样,因为我只在两列获得本周的纪录。我认为我可以使用IF的条件,但我不认为我可以简单地说“如果你是专栏A测试,如果不测试第二个”。

enter image description here

回答

1

内在地运用进行选择,这样的:

select vehicule, 
     (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date BETWEEN @Monday AND @SUNDAY) as 'Weekly', 
     (select count(*) from tablename t1 where t1.vehicule = t.vehicule and date >= @JanuaryFirst) as 'Annual' 
from tablename t 
+1

Ooooh不知道这件事。非常感谢先生。 – phadaphunk

+0

@PhaDaPhunk不是最好的解决方案,但它的工作:) –

+0

什么是最好的解决方案?有点新SQL:P – phadaphunk

2

如果你想避免子查询,你可以使用:

select vehicule, 
sum(case when date BETWEEN @Monday AND @SUNDAY then 1 else 0 end) as 'Weekly', 
sum(case when date >= @JanuaryFirst then 1 else 0 end) as 'Annual' 
group by vehicule 
3

这里是一个版本,不会产生多扫描:

select vehicule, 
    weekly = SUM(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 ELSE 0 END), 
    annual = SUM(CASE WHEN date >= @JanuaryFirst THEN 1 ELSE 0 END) 
from dbo.tablename AS t 
GROUP BY vehicule; 

或者你也可以尝试稍微不详细:

select vehicule, 
    weekly = COUNT(CASE WHEN date BETWEEN @Monday AND @SUNDAY THEN 1 END), 
    annual = COUNT(CASE WHEN date >= @JanuaryFirst THEN 1 END) 
from dbo.tablename AS t 
GROUP BY vehicule; 
+0

谢谢我会尝试这种方法,因为我的请求很长,所以当我添加子查询时,需要4分钟执行。 – phadaphunk