我试图解决这个问题。我被要求创建一个报告,显示我们数据库中的重复客户。
其中一项要求是,如果客户在特定日期有超过1个订单,则只计为1。 然后,如果他们有超过1个购买日期,他们将被视为重复客户。
在这里搜索,我发现这可以在特定购买日期找到超过1次购买的客户。
SELECT DISTINCT s.[CustomerName], s.PurchaseDate
FROM Reports.vw_Repeat s WHERE s.PurchaseDate <> ''
GROUP BY s.[CustomerName] , cast(s.PurchaseDate as date)
HAVING COUNT(*) > 1;
通过显示在同一天购买超过1次的客户,此MSSQL代码可以正常工作。 我的问题是最好的方法是将此加入另一个查询(这是我需要帮助的地方),然后显示一个完整的重复客户列表,其中将返回超过1次购买的客户。
我正在使用MSSQL。任何帮助将不胜感激。
答案 0 :(得分:0)
如果要将参数传递给查询并加入结果,那么表格函数的用途是什么。当你加入它时,你使用CROSS APPLY或OUTER APPLY而不是INNER JOIN或LEFT JOIN。
另外,我认为这不用说,但当你检查PurchaseDate是否为空时:
redirectToSessionStatePage() {
props.history.push('/sessionstate2'); OR
context.router.history.push('/sessionstate2');
}
可能是那里的问题......它意味着它是一个varchar字段而不是一个日期时间(是吗?)并且不处理空值。至少你可能想用ISNULL(s.PurchaseDate,&#39;&#39;)&lt;&gt;取而代之。 &#39;&#39 ;.如果它实际上是日期时间,请使用IS NOT NULL而不是&lt;&gt; &#39;&#39 ;.
(编辑添加示例数据和DDL语句。我建议将这些添加到SQL帖子以帮助回答者。另外,由于查询中的字符串比较,我使用了varchar而不是datetime。)
https://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx
WHERE s.PurchaseDate <> ''
答案 1 :(得分:0)
即将结束,您需要将distinct
移至having
条款中,因为您只想包含购买日期超过1的客户。
此外,仅按客户ID分组,因为不同的日期必须属于count distinct
工作的同一组。
SELECT s.[CustomerName], COUNT(distinct cast(s.PurchaseDate as date))
FROM Reports.vw_Repeat s WHERE s.PurchaseDate <> ''
GROUP BY s.[CustomerName]
HAVING COUNT(distinct cast(s.PurchaseDate as date)) > 1;
答案 2 :(得分:0)
首先感谢大家的帮助。 @MaxSzczurek建议我使用表值函数。在进一步研究之后,我最终只使用临时表来获得每个客户的DISTINCT购买日期。然后我将其加载到另一个临时表RIGHT JOINED到主表。这给了我正在寻找的结果。它有点(很多)丑陋,但它有效。