如何整合查询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
相关产品推荐
相关产品推荐

