首页 文章

获取日期范围与列中的最小日期之间的所有行

提问于
浏览
1

我正在尝试为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 /数量,数量和成本

我的问题是,我将如何进一步逐月解决这个问题?任何帮助表示赞赏!

编辑:好吧! :)所以这是上面查询的输出示例:

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

客户1在2013年1月1日之后开始收到发票,因此应该列出它们 .

Customer2在2012年和2013年有发票,因此它不应该在查询结果中 .

我真的希望这是可能的,我已经打了好几天了,而且宁愿跳过在我的代码中单独检查每个客户的痛苦过程 . :(我相信让数据库做的工作 . ;)

再次感谢任何帮助!

1 回答

  • 0

    您可以通过执行非常类似的查询来为这些客户提取更多详细信息,该查询将原始查询的"stripped-down"版本用作子查询,以将结果限制为感兴趣的客户 . 所有客户的基本查询都是......

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

相关问题