我有一个表,我需要在一个语句中计算两个具有不同条件的聚合函数。我怎么能这样做?
下面的伪代码:
SELECT count(CoumntA) *< 0*, count(CoumntA) * > 0*
FROM dbo.TableA
答案 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。