我有一张包含许多订单记录的表,每条记录都有一个名为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出了什么问题?
感谢。
答案 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)
如果您只想在日期范围内计算不同的电话号码,则不需要第二次计数,只需要第一次。
但是,我可能误解了你的问题。如果是的话,我很抱歉,请解释我错过的内容,我会尽力帮助。祝福,