mysql在很多行上使用with语句计算不同的数字

时间:2013-05-16 03:22:05

标签: mysql count distinct case

我有一张包含许多订单记录的表,每条记录都有一个名为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个不同的电话会议而不是条件。

如果我在count(distinct case when order_date < '2013-1-19' then phone end)中将日期范围缩短为[2013-1-1,2013-1-16],我得到了正确的结果。这次只有161415个不同的手机。

我的第一个sql出了什么问题?

感谢。

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:0)

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

但是,我可能误解了你的问题。如果是的话,我很抱歉,请解释我错过的内容,我会尽力帮助。

祝福,

相关问题