未在6个月内购买并且没有未完成销售订单的客户

时间:2014-01-28 23:34:41

标签: sql sql-server

我的任务是找出我们的客户在6个月内没有从我们这里购买并且没有未完成的销售订单。

该信息包含在两个表中: 客户和销售

客户编号对两个表都是通用的,我需要提取客户编号和名称 客户表有一个发票日期,所以我可以找到它,销售表的状态列包括已关闭和打开状态以及日期打印列。

我确信这就是我需要把它放在一起的所有内容,但我很难过。

抱歉,我想我没有很好地解释自己。 我知道会写类似的东西。

Select Distinct I.Customer,
  I.InvoiceToName
From
  tblarInvoice I
  Inner Join tblsoSO S 
  On I.CustomerShipTo = S.CustomerShipTo   

  Where max(I.dateprinted) <= '06/01/2013' 
  or max(S.dateordered) <= '06/01/2013' 
  and S.status = 'closed'

上述情况不会起作用,因为我认为我会将每条记录都记录回来,而我只需要那些在过去6个月内没有订购过的记录。更不用说Where语句中聚合的问题了。我知道哪些不起作用,但即使它是我想要的也不知道如何工作。

所以我很难过用什么来获得6个月前的无订单。

1 个答案:

答案 0 :(得分:1)

做一点“集思考”,这应该可以帮助你构建一些查询。

您有一组customers和一组sales。这些人的交集是从你那里购买产品的customers;加入这些表格,找出他们是谁。

另一个要求是他们“没有未完成的订单”。您说status字段告诉您订单是否“打开”,因此这将成为您的WHERE子句的一部分,以过滤销售行。

看看是否能让你入门,尝试一下,如果你遇到问题就会陷入困境,并就特定问题寻求帮助。目前,您只是要求人们为您编写查询:)

修改

查看您添加的查询,您最初所说的内容存在一些不一致之处。

您提到了CustomerSales表,但您使用的是tblarInvoice(发票?)tblsoSO(Sales_Order?)。我将简化问题并假设订单的所有信息都在一个表Sales_Order中;您可以修改查询以使用您拥有的实际表。

您需要定义“过去6个月未订购”的实际含义。你有两个日期字段;我将假设date_ordered必须超过6个月前而忽略dateprinted,因为这听起来像是后来发生的事情。

我们可以使用DATEDIFF从当前日期扣除6个月,因此每当您运行查询时,您将在过去6个月内获得“滚动”:

SELECT  customer
FROM    Sales_Order
WHERE   date_ordered <= DATEADD(month, -6, CURRENT_TIMESTAMP)

您还希望一组客户排除任何拥有“未结”订单的客户:

SELECT DISTINCT
        SO1.customer
FROM    ( SELECT    customer
          FROM      Sales_Order
          WHERE     order_status = 'closed'
        ) SO1
        LEFT JOIN ( SELECT  customer
                    FROM    Sales_Order
                    WHERE   order_status = 'open'
                  ) SO2 ON SO1.customer = SO2.customer
WHERE   SO2.customer IS NULL

现在将其与过去6个月未订购的客户组合。 顺便说一下,我并不是说这是编写查询的最佳方式,我只是想让它易于理解:

SELECT DISTINCT
        SO1.customer
FROM    ( SELECT    customer
                   ,date_ordered
          FROM      Sales_Order
          WHERE     order_status = 'closed'
        ) SO1
        LEFT JOIN ( SELECT  customer
                    FROM    Sales_Order
                    WHERE   order_status = 'open'
                  ) SO2 ON SO1.customer = SO2.customer
WHERE   SO2.customer IS NULL
        AND date_ordered <= DATEADD(month, -6, CURRENT_TIMESTAMP)