2013-05-10 162 views
1

我试图构造一个SQL语句的MS Access抓住从我们的数据库由产品的所有销售从未被出售给特定客户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#)); 

表销售包含:ID,发票号码,客户ID和日期。 (我叫它发票,但我没有设计它...)SalesDetail是每个发票行项目:销售/发票ID,产品ID /数量,数量和成本

我的问题是,我将如何打破这按月进一步?任何帮助表示赞赏!

编辑: Alrighty! :)因此,这里是从上述查询输出的示例:

CustomerID | MinOfInvoice | SumOfStdCost 
Customer1 | 2/1/2013  | $300 

我想什么,是要表明每一张发票,它的日期(或仅仅一个月,无所谓),同时保持分组/表达式( ?)具有最小的发票日期大于2013年1月1日,如客户的标准,以便

CustomerID | InvoiceDateMonth | StdCost 
Customer1 | 2/1/2013   | $100 
Customer1 | 3/15/2013   | $130 
Customer1 | 4/7/2013   | $70 

customer1表开始2013年1月1日之后收到的发票,所以他们应该被列出。

顾客2在2012年和2013年的发票,所以它不应该是在查询结果中。

我真的希望这是可能的,我一直在打我的头好几天了,宁愿跳过不必逐个检查每个客户在我的代码的痛苦过程。再次)

感谢所有帮助; :(我相信使数据库做的工作!

+0

术语“按月进一步打破了这一点,”是PRET ty含糊不清。考虑[编辑](http://stackoverflow.com/posts/16490206/edit)你的问题,包括要应用于选择/合并标准的你想要的结果是什么样子的例子,。有时候这样做甚至会帮助你回答你自己的问题。 – 2013-05-11 13:01:03

回答

0

您可以通过执行使用原始查询的“简装版”为子查询限制的结果,那些感兴趣的客户非常类似的查询拔出详细为这些客户。为所有客户提供基本的查询会...

SELECT 
    Sales.CustomerID, 
    Sales.InvoiceDate, 
    SalesDetail.StdCost 
FROM 
    Sales INNER JOIN SalesDetail 
     ON Sales.SalesID = SalesDetail.SalesID 

...所以我们可以简单的添加使用相似的逻辑将您的原始查询,只包括我们要

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# 
     ) 
客户WHERE子句

另一种方式来做到这一点是使用一个稍微不同的子查询排除客户与早期发票

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# 
     ) 
+0

这是完美的,不仅是结果,而且了解子查询!谢谢! – 2013-05-15 16:11:58