0

我有一个包含许多订单记录的表,每条记录都有一个名为 phone 的列,用于指示用户。

我想要做的是计算某个日期范围内的不同电话号码。我的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) in count(distinct case when order_date < '2013-1-19' then phone end),我得到了正确的结果。而这次只有161415个不同的电话。

我的第一个 sql 有什么问题?

谢谢。

4

2 回答 2

1

只需先使用COUNT(DISTINCT phone)orGROUP BY phoneCOUNT()在外部选择中使用即可获得不同的值。

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

更新:如果我正确理解您的评论,您可以随时执行以下操作

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

于 2013-05-16T04:11:04.540 回答
0

如果您只想要日期范围内不同电话号码的计数,则不需要第二个计数,只需要第一个。

不过,我可能误解了你的问题。如果是这样,我很抱歉,请解释我缺少什么,我会尽力提供帮助。

最好的祝愿,

于 2013-05-16T03:42:08.310 回答