我有包含两个DATE列的表。 TS_customer和TS_verified
我正在寻找一种获得结果的方法,在第一列中我有一个日期,其中有人创建了一个用户(TS_customer)或有人得到了验证(TS_verified)。
在第二列中,我希望count(TS_customer)按第一列分组。 我希望计数的第三列(TS_verified)按第一列分组。
可能是0个客户在注册日期验证,而在另一个案例中0个注册是在有人验证的日期。
我想它应该是一个简单的,但我现在花了这么多时间。非常感谢一些帮助。我需要这个用于excel中的图形,所以我基本上想要有多少客户注册,有多少客户有一天得到验证而没有麻烦有两个选择并手动组合它们。
编辑:链接到SQLfiddle http://sqlfiddle.com/#!2/b14fc/1/0
由于
答案 0 :(得分:2)
首先,我们需要几天的清单。
看起来像http://sqlfiddle.com/#!2/b14fc/14/0:
SELECT DISTINCT days
FROM (
SELECT DISTINCT DATE(TS_customer) days
FROM customer
UNION
SELECT DISTINCT DATE(TS_verified) days
FROM customer
) AS alldays
WHERE days IS NOT NULL
ORDER BY days
接下来,我们需要按天计算客户数量的摘要。这很简单http://sqlfiddle.com/#!2/b14fc/16/0:
SELECT DATE(TS_customer) days, COUNT(TS_customer)
FROM customer
GROUP BY days
白天验证摘要同样容易。
接下来,我们需要将这三个子查询加在一起http://sqlfiddle.com/#!2/b14fc/29/0。
SELECT alldays.days, custcount, verifycount
FROM (
SELECT DISTINCT DATE(TS_customer) days
FROM customer
UNION
SELECT DISTINCT DATE(TS_verified) days
FROM customer
) AS alldays
LEFT JOIN (
SELECT DATE(TS_customer) days, COUNT(TS_customer) custcount
FROM customer
GROUP BY days
) AS cust ON alldays.days = cust.days
LEFT JOIN (
SELECT DATE(TS_verified) days, COUNT(TS_verified) verifycount
FROM customer
GROUP BY days
) AS verif ON alldays.days = verif.days
WHERE alldays.days IS NOT NULL
ORDER BY alldays.days
最后,如果您希望在没有客户和/或验证的情况下显示0
而不是(null)
,请将SELECT行更改为此http://sqlfiddle.com/#!2/b14fc/30/0。
SELECT alldays.days,
IFNULL(custcount,0) AS custcount,
IFNULL(verifycount,0) AS verifycount
看看怎么样?我们逐步构建您的结果集。
答案 1 :(得分:0)
我有点困惑为什么你创建了一个不能在TS_Customer上保存null
值的小提琴,然后提到该字段可以保存null
值。
话虽如此,我已经修改了解决方案以使用null
值并仍然非常高效和简单:
SELECT days, sum(custCount) custCount, sum(verifCount) verifCount FROM (
SELECT DATE(TS_customer) days, count(*) custCount, 0 verifCount
FROM customer
WHERE TS_customer IS NOT NULL
GROUP BY days
UNION ALL
SELECT DATE(TS_verified) days, 0, count(*)
FROM customer
WHERE TS_verified IS NOT NULL
GROUP BY days
) s
GROUP BY days
我还创建了一个不同的小提琴,其中包含一些空值here。