每月计数(如果唯一)

时间:2018-08-09 20:59:07

标签: mysql sql phpmyadmin

我正在尝试获取一个SQL查询来统计该月唯一的personid,是“回头客”,除非他们也有该月的“新”记录。

month |    personid   | visitstat
---------------------------------
January     john          new
January     john          returning
January     Bill          returning

因此,我要查找的查询应该为每个具有“返回”的唯一个人标识获取计数,除非该个人标识也存在“新”字样-在这种情况下,返回{的count为1 / p>

January Bill returning

因为约翰本月是新来的。

我尝试过的查询是

SELECT COUNT(distinct personid) as count FROM visit_info WHERE visitstat = 'Returning' GROUP BY MONTH(date) ORDER BY date

不幸的是,即使该月该人存在“新”记录,也算为“返回”。

预先感谢,希望我对此解释足够清楚。

SQL Database Image

Chart of Data

2 个答案:

答案 0 :(得分:0)

您已经自己写了“魔术”一词,即“存在”。您可以确切地使用using System.Windows.Forms; namespace V3125_False_Positive { static class Program { static void Main() { if (new Control() is Control control && control.Parent != null) { string parentname = control.Parent.Name; } } } } 和相关的子查询。

NOT EXISTS

我还建议在SELECT count(DISTINCT vi1.personid) count FROM visit_info vi1 WHERE vi1.visitstat = 'Returning' AND NOT EXISTS (SELECT * FROM visit_info vi2 WHERE vi2.personid = vi1.personid AND year(vi2.date) = year(vi1.date) AND month(vi2.date) = month(vi1.date) AND vi2.visitstat = 'New') GROUP BY year(vi1.date), month(vi1.date) ORDER BY year(vi1.date), month(vi1.date); 表达式中包括年份,否则当数据跨越一年以上时,您可能会得到意想不到的结果。也只能使用GROUP BY子句中包含的表达式或GROUP BY子句中传递给聚合函数的表达式。与几乎所有其他DBMS相比,MySQL可能会接受它,但也可能会产生奇怪的结果。

答案 1 :(得分:-1)

我还面临与数据库处理相同的情况之一。我做的可能方法是通过具有条件子句和子查询来使用group by。