SQL 2使用不同的过滤器计数

时间:2012-03-16 10:15:39

标签: sql sql-server

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

下面的伪代码:

SELECT count(CoumntA) *< 0*, count(CoumntA) * > 0*
FROM dbo.TableA

6 个答案:

答案 0 :(得分:3)

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

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

这不太好的时候是......
- 有一个关于CoumntA的索引 - 大多数值(50%或更多感觉正确) 正好为零

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

然而,我给出的例子每次都扫描整个表格。只有一次,但始终是整个表。当你计算大部分记录时,这是值得的。在你的情况下,它看起来像你在计算大部分或全部,所以这可能是一个很好的方法。

答案 1 :(得分:3)

这与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

答案 2 :(得分:1)

可以在一个选择语句中执行此操作。

我以前做过的方式是这样的:

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时没有覆盖案例!

答案 3 :(得分:0)

SELECT
SUM(IF(CoumntA < 0, 1, 0)) AS lowerThanZero,
SUM(IF(CoumntA > 0, 1, 0)) AS greaterThanZero
FROM
TableA

是否清楚发生了什么?问,如果你还有其他问题。

较短的表格是

SELECT
SUM(CoumntA < 0) AS lowerThanZero,
SUM(CoumntA > 0) AS greaterThanZero
FROM
TableA

这是可能的,因为在MySQL中,真实条件等于1,错误条件等于0

编辑:好的,好的,抱歉,不知道为什么我认为这是关于MySQL的。

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

答案 4 :(得分:0)

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在原始记录集上创建分区,否则可以在两个组中计算相同的记录。

答案 5 :(得分: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     

演示here