单个查询中的多计数 - Oracle

时间:2011-06-21 16:03:01

标签: java sql oracle select

我需要在同一个表中计算两个时间段内的两个数据。 我试过这样的事情:

SELECT COUNT(CASE
                 WHEN click_date='2011-06-20' THEN 0
                 ELSE 1
             END) AS ThisDayCount, COUNT(1) ToDayCount
FROM MyTable
WHERE click_date BETWEEN '2011-05-01'AND 2011-06-20;

所以基本上我想从一天开始计算ThisDayCount并计算从2011-05-01到2011-05-20

click_date是一个字符串。

3 个答案:

答案 0 :(得分:5)

您就在那里,只需使用SUM代替COUNT

select 
    sum(case when click_date='2011-06-20' then 0 else 1 end) as ThisDayCount, 
    count(1) ToDayCount 
from MyTable 
where click_date between '2011-05-01'and 2011-06-20;

答案 1 :(得分:5)

现有的解决方案是正确的,但不解释为什么你会看到这种现象。 SQL语句中的Count返回查询中的非空值的数量。由于您的查询返回1或0,count将使用这两个值。

这可以通过使用sum添加列中的值(根据@Adrian的解决方案)或更改case语句以返回null来解决不计算(根据@ ypercube的解决方案)。

两种解决方案的表现大致相同,并且会返回相同的结果,所以这只是个人偏好的问题。

答案 2 :(得分:2)

SELECT COUNT( CASE
                  WHEN click_date='2011-06-20' THEN 1
                  ELSE NULL
              END ) AS ThisDayCount
     , COUNT(*) AS ToDayCount
FROM MyTable
WHERE click_date BETWEEN '2011-05-01' AND '2011-06-20' ;