2013-05-16 3 views
0

У меня есть таблица со многими данными о заказе, и каждая запись имеет столбец с именем phone, используемый для указания пользователя.mysql count num num using with statment on too many rows

Что я хочу сделать, так это подсчет отдельного номера телефона в некоторых диапазонах дат. И мой SQL, как следует за:

select count(distinct phone), 
count(distinct case when order_date < '2013-1-19' then phone end) 
from some_table 
where order_date >= '2013-1-1' and order_date < '2013-2-1' 

и результат странно:

194410 0 

Оператор count(distinct case when order_date < '2013-1-19' then phone end) получил результат НОЛЬ! Однако, когда я вручную проверил результат, используя следующий SQL:

select count(distinct phone) 
from some_table 
where order_date >= '2013-1-1' and order_date < '2013-1-19' 

Я был проинформирован о том, что есть 171300 отчетливый встреча телефон, чем состояние.

И если я уменьшу диапазон дат до [2013-1-1, 2013-1-16] в count(distinct case when order_date < '2013-1-19' then phone end), я получил правильный результат. На этот раз есть только 161415 различных телефонов.

Что случилось с моим первым sql?

Спасибо.

ответ

0

Если вам нужен только подсчет различных телефонных номеров в пределах диапазона дат, вам не нужен второй счет, только первый.

Возможно, я, возможно, неправильно понял ваш вопрос. Если это так, я сожалею, и, пожалуйста, объясните, что мне не хватает, и я постараюсь помочь.

С наилучшими пожеланиями,

+0

Извините за недоразумение. Я хочу рассчитать чистый рост номера телефона. Во-первых, я рассчитываю отдельный номер телефона в течение 2013-1-1 и 2013-1-31. Затем я вычисляю отдельный номер телефона в течение 2013-1-1 и 2013-1-18 годов. Наконец, чистый рост будет рассчитываться путем вычитания значения, полученного на первом и втором шагах. – jlyu

+0

@jlyu Вам нужна дополнительная помощь по вашему вопросу? – peterm

+0

@jlyu - peterm ответил на ваш вопрос адекватно, если я правильно понял. Upvoted! –

1

Просто использовать COUNT(DISTINCT phone) или GROUP BY phone первый и COUNT() в наружный выбрать, чтобы получить различные значения.

SELECT COUNT(DISTINCT phone) total 
    FROM orders 
    WHERE order_date BETWEEN '2013-05-01' 
         AND '2013-05-07' 

или

SELECT COUNT(*) total 
    FROM (SELECT phone 
      FROM orders 
     WHERE order_date BETWEEN '2013-05-01' 
           AND '2013-05-07' 
     GROUP BY phone) q 

SQLFiddle

UPDATE: Если я правильно понял ваш комментарий правильно вы всегда можете сделать следующее

SELECT total1, total2, total1-total2 total3 
FROM(SELECT 
(SELECT COUNT(DISTINCT phone) 
    FROM orders 
    WHERE order_date BETWEEN '2013-05-01' 
         AND '2013-05-07') total1, 
(SELECT COUNT(DISTINCT phone) 
    FROM orders 
    WHERE order_date BETWEEN '2013-05-01' 
         AND '2013-05-04') total2) n 

Выход:

| TOTAL1 | TOTAL2 | TOTAL3 | 
---------------------------- 
|  4 |  2 |  2 | 

SQLFiddle

+0

В этом разделе вы можете вычислить номер телефона с точностью до 2013-5-1.Тем не менее, я хочу как отдельный номер телефона в [2013-5-1, 2-13-5-7], так и [2013-5-1, 2013-6-1]. – jlyu

+0

@jlyu См. Обновленный ответ – peterm

+0

@jlyu Вам нужна дополнительная помощь по вашему вопросу? – peterm