Multi count в одном запросе - Oracle - PullRequest
3 голосов
/ 21 июня 2011

Мне нужно сосчитать две данные в одной таблице за 2 периода времени.Я пробовал что-то вроде этого:

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 ]

5 голосов
/ 21 июня 2011

Существующие решения верны, но не объясняйте, почему вы видите это явление.Count в операторах SQL возвращает количество ненулевых значений в запросе.Поскольку ваш запрос возвращает 1 или 0, count будет использовать оба значения.

Это можно решить с помощью sum для добавления значений в столбец (согласно решению @ Adrian) или путем изменения case оператор для возврата null для записей, которые не должны учитываться (согласно решению @ ypercube).

Оба решения работают примерно одинаково и возвращают одинаковый результат, так что на самом деле это всего лишьличные предпочтения.

5 голосов
/ 21 июня 2011

Вы почти там, просто используйте 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;
2 голосов
/ 21 июня 2011
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' ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...