如何为收据表中的每个客户找到最后支付的账单

Posted

技术标签:

【中文标题】如何为收据表中的每个客户找到最后支付的账单【英文标题】:How to find the last paid bill for every customers present in the Receipt table 【发布时间】:2014-01-23 11:18:33 【问题描述】:

表格名称:收据

列: 收据编号,客户编号,收据日期,收据金额

客户会支付很多账单。我想在收据表中找到每个客户最后支付的账单的详细信息。我使用了嵌套查询,但没有得到正确的结果。

select customer_id,receipt_date from receipt where receipt_id=(select top 1 receipt_id from receipt order by customer_id desc)

我使用 Access 2007,C#2.0。

【问题讨论】:

re:“我使用了嵌套查询,但没有得到正确的结果。” - 请编辑您的问题,向我们展示您的尝试。 select customer_id,receipt_date fromreceipt_id=(select top 1receipt_id from receipt order by customer_id desc) 【参考方案1】:

要获取每个客户的最新收据的详细信息,您需要首先查找每个 [customer_id] 的最新 [receipt_date]

SELECT
    customer_id,
    MAX(receipt_date) AS max_receipt_date
FROM receipt
GROUP BY customer_id

然后,您可以将其用作查询中的一个组件,以返回该 [customer_id] 和日期的整个 [receipt] 行:

SELECT receipt.*
FROM
    receipt
    INNER JOIN
    (
        SELECT
            customer_id,
            MAX(receipt_date) AS max_receipt_date
        FROM receipt
        GROUP BY customer_id
    ) AS max
        ON max.customer_id = receipt.customer_id
            AND max.max_receipt_date = receipt.receipt_date

【讨论】:

有没有可能拿到receipt_id??【参考方案2】:
SELECT r1.*
FROM receipt r1
WHERE r1.recipt_date
    =
    (SELECT MAX(receipt_date) FROM receipt r2
         WHERE r2.customer_id = r1.customer_id
    );

此解决方案使用相关的子查询。

【讨论】:

【参考方案3】:

假设每次客户进行购买时都会插入记录,customer_id 始终保持不变,只有receipt_id 不同......那么下面的SQL查询应该可以工作

选择receipt_id,receipt_date 从收据 按 customer_id 分组;

你也可以按receipt_date添加订单

【讨论】:

Access 不会这样。 [receipt_date] 要么必须用于聚合函数(例如 MAX()),要么包含在 GROUP BY 子句中。 那么如何找到最后一张收据呢?? 通过运行上面的查询,每个receipt_id都与最新日期相关联......并通过receipt_date添加订单,您可以根据最新日期获取收据列表 “按 customer_id 从收据组中选择receipt_id ,receipt_date 并按receipt_date desc 订购”它不起作用。我不太擅长 SQL 查询。 对不起,没有。当前形式的查询根本无效:“您尝试执行的查询不包含指定表达式 'receipt_id' 作为聚合函数的一部分。”

以上是关于如何为收据表中的每个客户找到最后支付的账单的主要内容,如果未能解决你的问题,请参考以下文章

如何为mysql中的每条记录检索表中的两条记录

如何为连接表中的其他属性创建多对多 Hibernate 映射?

如何为 xsl-fo 中的每个页面添加页眉和页脚以生成 pdf

如何为多个模型提供连续的 ID?

如何为数据库表中的每条记录生成一个id?

如何为 SQL 中的每个特定列应用窗口? [复制]