我的任务是找出我们的客户在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个月前的无订单。
答案 0 :(得分:1)
做一点“集思考”,这应该可以帮助你构建一些查询。
您有一组customers
和一组sales
。这些人的交集是从你那里购买产品的customers
;加入这些表格,找出他们是谁。
另一个要求是他们“没有未完成的订单”。您说status
字段告诉您订单是否“打开”,因此这将成为您的WHERE
子句的一部分,以过滤销售行。
看看是否能让你入门,尝试一下,如果你遇到问题就会陷入困境,并就特定问题寻求帮助。目前,您只是要求人们为您编写查询:)
修改强>
查看您添加的查询,您最初所说的内容存在一些不一致之处。
您提到了Customer
和Sales
表,但您使用的是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)