使用不同筛选器的SQL 2计数

使用不同筛选器的SQL 2计数,sql,sql-server,Sql,Sql Server,我有一个表,我需要在一个语句中计算两个具有不同条件的聚合函数。我该怎么做 伪代码如下: SELECT count(CoumntA) *< 0*, count(CoumntA) * > 0* FROM dbo.TableA 清楚发生了什么吗?如果你还有任何问题,请提问 较短的形式是 SELECT SUM(CoumntA < 0) AS lowerThanZero, SUM(CoumntA > 0) AS greaterThanZero FROM TableA 这是可能的

我有一个表,我需要在一个语句中计算两个具有不同条件的聚合函数。我该怎么做

伪代码如下:

SELECT count(CoumntA) *< 0*, count(CoumntA) * > 0*
FROM dbo.TableA
清楚发生了什么吗?如果你还有任何问题,请提问

较短的形式是

SELECT
SUM(CoumntA < 0) AS lowerThanZero,
SUM(CoumntA > 0) AS greaterThanZero
FROM
TableA
这是可能的,因为在MySQL中,真条件等于1,假条件等于0

编辑:好吧,好吧,对不起,我不知道为什么我认为这是关于MySQL的

请参阅有关正确语法的其他答案

select '< 0' as filter, COUNT(0) as cnt from TableA where [condition 1]
union
select '> 0' as filter, COUNT(0) as cnt from TableA where [condition 2]

确保条件1和条件2在原始记录集上创建一个分区,否则在两个组中可以计算相同的记录。

可以在一个select语句中完成此操作

我以前的做法是这样的:

SELECT SUM(CASE WHEN ColumnA < 0 THEN 1 END) AS LessThanZero, 
       SUM(CASE WHEN ColumnA > 0 THEN 1 END) AS GreaterThanZero
FROM dbo.TableA 
这是正确的MS SQL语法,我相信这是一种非常有效的方法


别忘了,当ColumnA=0时,您并没有覆盖该案例

对于SQL Server,一种方法是

SELECT COUNT(CASE WHEN CoumntA<0 THEN 1 ELSE NULL END),
       COUNT(CASE WHEN CoumntA>0 THEN 1 ELSE NULL END)
FROM dbo.TableA     

演示。

正如@tombom演示的,这可以作为单个查询完成。但这并不意味着应该这样

这不太好的时候是。。。 -CoumntA上有一个索引 -大多数50%或更多的感觉正确的值都是零

在这种情况下,两个查询将更快。这是因为每个查询都可以使用索引快速定位要统计的部分。最后只算相关记录


然而,我给出的示例每次都扫描整个表。只有一次,但总是整张桌子。这是值得的,当你计算大多数记录。在您的情况下,看起来您正在计算大部分或全部,因此这可能是一种很好的方法。

这与tombom的答案相同,但使用SQL Server语法:

SELECT
    SUM(CASE WHEN CoumntA < 0 THEN 1 ELSE 0 END) AS LessThanZero,
    SUM(CASE WHEN CoumntA > 0 THEN 1 ELSE 0 END) AS GreaterThanZero
FROM TableA

这两种都不是SQL Server语法。不过你的方法很正确。@tombom-将它们改为CASE-WHEN,MySQL捷径在SQL Server上不起作用。为什么在我三分钟前写了几乎相同的东西时,会将其标记为答案?抱歉@Dommer,我发布时没有看到你的答案。就个人而言,我认为Dems的答案是最完整的。这很酷。我认为我的感觉更快,因为我故意不去处理CASE-ELSE位,但我敢打赌它们实际上都是一样的。@Dommer-如果没有显式的ELSE块,您就隐式地拥有ELSE-NULL。因此,唯一真正的好处是最初解析查询字符串,但计划是相同的。
SELECT
  SUM(CASE WHEN CoumntA < 0 THEN 1 ELSE 0 END)   AS less_than_zero,
  SUM(CASE WHEN CoumntA > 0 THEN 1 ELSE 0 END)   AS greater_than_zero
FROM
  TableA
SELECT
    SUM(CASE WHEN CoumntA < 0 THEN 1 ELSE 0 END) AS LessThanZero,
    SUM(CASE WHEN CoumntA > 0 THEN 1 ELSE 0 END) AS GreaterThanZero
FROM TableA