2

你怎么能有Select两列并让每一列测试它自己的条件而不是其他的?

假设我有一个选择Count表中的每条记录。在一个列中,我想要本周的所有记录,在第二列中,我想要自年初以来的所有记录。

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

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

但不能就这么说,因为我只会得到这两个专栏的本周记录。我以为我可以使用一个IF条件,但我认为我不能简单地说“如果你是 A 列测试,如果不是第二个测试”。

在此处输入图像描述

4

3 回答 3

4

这是一个不会产生多次扫描的版本:

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;
于 2012-06-26T13:22:31.543 回答
2

Use INNER SELECTS, like this:

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
于 2012-06-26T13:07:21.607 回答
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
于 2012-06-26T13:21:56.553 回答