【问题标题】:Different conditions in one select statement一个选择语句中的不同条件
【发布时间】:2012-06-27 19:10:54
【问题描述】:

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

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

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

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

但不能这样说,因为我只会在这两个栏目中获得本周的记录。我以为我可以使用IFcondition,但我认为我不能简单地说“如果你是 A 列测试,如果不是第二个测试”。

【问题讨论】:

    标签: sql-server-2008 select where-clause


    【解决方案1】:

    使用 INNER SELECTS,如下所示:

    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
    

    【讨论】:

    • 哦哦不知道这个。非常感谢先生。
    • 最好的解决方案是什么?对 SQL 有点陌生:P
    • 这是相当昂贵的,不是吗?我还建议不要将'single quotes' 用作别名分隔符;此语法已被弃用。仅在必要时使用[square brackets]"double quotes" 更安全。
    • @AaronBertrand 为什么使用括号或双引号更安全?
    • 因为列别名的'this syntax' 已被弃用。这意味着在某些时候代码将停止工作。我talk about this herethe official documentation is here。目前AS 'foo' 被列为适当的形式,'foo' = 是不适当的,但我不相信这是意图或它会保持这种方式。
    【解决方案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;
      

      【讨论】:

      • 谢谢,我会尝试这种方法,因为我的请求真的很长,所以当我添加子查询时,它需要大约 4 分钟才能执行。
      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多