我正在尝试获取一个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
不幸的是,即使该月该人存在“新”记录,也算为“返回”。
预先感谢,希望我对此解释足够清楚。
答案 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。