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

Posted

技术标签:

【中文标题】获取日期范围与列中最小日期之间的所有行【英文标题】:Getting all rows between date range with min date in column 【发布时间】:2013-05-10 20:19:15 【问题描述】:

我正在尝试为 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#));

销售表包含:ID、发票编号、客户 ID 和日期。 (我称之为发票,但不是我设计的……)SalesDetail 是每个发票行项目:销售/发票 ID、产品ID/编号、数量和成本

我的问题是,如何按月进一步细分?任何帮助表示赞赏!

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

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 日之后开始收到发票,因此应将其列出。

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

我真的希望这是可能的,我已经为此绞尽脑汁好几天了,我宁愿跳过必须在我的代码中单独检查每个客户的痛苦过程。 :(我相信让数据库完成这项工作。;)

再次感谢您的帮助!

【问题讨论】:

“按月进一步细分”一词相当模糊。考虑editing 您的问题,包括您希望结果看起来如何的示例,以及您希望应用的选择/聚合标准。有时这样做甚至可以帮助您回答自己的问题。 【参考方案1】:

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

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

【讨论】:

这很完美,不仅是结果,而且知道子查询!谢谢!

以上是关于获取日期范围与列中最小日期之间的所有行的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有周末的情况下获取日期范围之间的所有日期?

SQL查询获取特定日期和列中最新日期之间的数据

MySQL:即使没有日期行,有没有办法获取两个日期之间所有日期的数据?

如何获取日期范围内的缺失值?

从 2 个 REF 列中获取两个日期之间的差异

获取两个日期之间的月份范围