我正在尝试为MS Access构建一个SQL语句,以便从2013年1月1日之前从未销售给特定客户的产品中获取我们数据库中的所有销售。我相信以下SQL语句可以做到这一点:
SELECT
Sales.CustomerID,
Min(Sales.InvoiceDate) AS MinOfInvoiceDate,
Sum(SalesDetail.StdCost) AS SumOfStdCost
FROM
Sales INNER JOIN SalesDetail
ON Sales.SalesID = SalesDetail.SalesID
GROUP BY
Sales.CustomerID
HAVING
(((Min(Sales.InvoiceDate))>=#1/1/2013#));
表Sales包含:ID,发票号,客户ID和日期。 (我称之为发票,但我没有设计它......)SalesDetail是每个发票行项目:销售/发票ID,产品ID /数量,数量和成本
我的问题是,我将如何在月份之前进一步解决这个问题?任何帮助表示赞赏!
编辑: Alrighty! :)所以这是上面查询的输出示例:
CustomerID | MinOfInvoice | SumOfStdCost
Customer1 | 2/1/2013 | $300
我想要的是,在保持最小发票日期大于1/1 /的客户的分组/表达(?)标准的同时,显示每张发票及其日期(或仅月份,无关紧要) 2013年,像这样
CustomerID | InvoiceDateMonth | StdCost
Customer1 | 2/1/2013 | $100
Customer1 | 3/15/2013 | $130
Customer1 | 4/7/2013 | $70
客户1在2013年1月1日之后开始收到发票,因此应列出它们。
Customer2在2012年和2013年都有发票,所以它不应该在查询结果中。
我真的希望这是可能的,我现在已经打了好几天,宁愿跳过在我的代码中单独检查每个客户的痛苦过程。 :(我相信让数据库完成工作。;)
再次感谢您的帮助!
答案 0 :(得分:0)
您可以通过执行非常类似的查询来提取这些客户的更多详细信息,该查询使用原始查询的“精简版”作为子查询来将结果限制为感兴趣的客户。所有客户的基本查询都是......
SELECT
Sales.CustomerID,
Sales.InvoiceDate,
SalesDetail.StdCost
FROM
Sales INNER JOIN SalesDetail
ON Sales.SalesID = SalesDetail.SalesID
...所以我们可以简单地添加一个WHERE子句,该子句使用与原始查询类似的逻辑,仅包含我们想要的客户
SELECT
Sales.CustomerID,
Sales.InvoiceDate,
SalesDetail.StdCost
FROM
Sales INNER JOIN SalesDetail
ON Sales.SalesID = SalesDetail.SalesID
WHERE
Sales.CustomerID IN
(
SELECT CustomerID
FROM Sales
GROUP BY CustomerID
HAVING MIN(InvoiceDate)>=#2013-01-01#
)
另一种方法是使用稍微不同的子查询来排除早期发票的客户
SELECT
Sales.CustomerID,
Sales.InvoiceDate,
SalesDetail.StdCost
FROM
Sales INNER JOIN SalesDetail
ON Sales.SalesID = SalesDetail.SalesID
WHERE
Sales.CustomerID NOT IN
(
SELECT CustomerID
FROM Sales
WHERE InvoiceDate<#2013-01-01#
)