You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何整合查询2013年客户最大发票金额的CTE,关联对应客户及发票日期

如何整合查询2013年客户最大发票金额的CTE,关联对应客户及发票日期

嘿,我来帮你搞定这个问题~你现在的核心问题是:写的CTE只算出了每个客户2013年的最高发票金额,但没把这个金额和具体的发票记录(比如发票日期、对应的InvoiceID)绑定起来,所以没法直接和后面的客户、发票信息关联上。

我给你两种实用的解决办法:

方法一:修改现有CTE,补充关联字段

我们可以调整CTE,让它同时保留客户ID和对应的最高金额,然后在主查询里通过客户ID+金额来匹配到具体的发票记录:

WITH highque AS (
    SELECT 
        i.CustomerID,
        MAX(il.ExtendedPrice) AS highest
    FROM Sales.InvoiceLines il
    JOIN Sales.Invoices i ON il.InvoiceID = i.InvoiceID
    WHERE i.InvoiceDate BETWEEN '2013-01-01' AND '2013-12-31'
    GROUP BY i.CustomerID
)
SELECT 
    i.InvoiceDate,
    c.CustomerName,
    il.ExtendedPrice AS HighestInvoiceAmount
FROM Sales.Invoices i
JOIN Sales.Customers c ON c.CustomerID = i.CustomerID
JOIN Sales.InvoiceLines il ON il.InvoiceID = i.InvoiceID
-- 关联CTE,匹配客户ID和对应的最高金额
JOIN highque ON i.CustomerID = highque.CustomerID 
    AND il.ExtendedPrice = highque.highest
WHERE i.InvoiceDate BETWEEN '2013-01-01' AND '2013-12-31'
ORDER BY c.CustomerName;

这样一来,CTE就相当于一个“客户-最高金额”的映射表,主查询通过这个映射就能精准定位到每个客户下金额最高的那笔(或几笔)发票,同时拿到对应的日期和客户名。

方法二:用窗口函数更简洁实现

如果不想用CTE,用窗口函数会更直接,一步到位就能筛选出每个客户的最高金额发票:

SELECT 
    InvoiceDate,
    CustomerName,
    ExtendedPrice AS HighestInvoiceAmount
FROM (
    SELECT 
        i.InvoiceDate,
        c.CustomerName,
        il.ExtendedPrice,
        -- 按客户分组,给发票金额降序排名,排名1的就是最高金额
        RANK() OVER (PARTITION BY c.CustomerID ORDER BY il.ExtendedPrice DESC) AS PriceRank
    FROM Sales.InvoiceLines il
    JOIN Sales.Invoices i ON il.InvoiceID = i.InvoiceID
    JOIN Sales.Customers c ON c.CustomerID = i.CustomerID
    WHERE i.InvoiceDate BETWEEN '2013-01-01' AND '2013-12-31'
) AS RankedInvoices
WHERE PriceRank = 1
ORDER BY CustomerName;

这里用RANK()的好处是:如果某个客户有多笔金额相同的最高发票,所有这些记录都会被保留;如果你只想取其中任意一条,可以把RANK()换成ROW_NUMBER()。

备注:内容来源于stack exchange,提问作者immaneedsomehelp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:19:52