SQL Server技术问询:基于Northwind数据库实现货运统计及占比最大值标记
解决Northwind数据库按年统计货运公司报表的问题
嘿,我来帮你搞定这个Northwind的报表需求!根据你的描述,我们需要按年份统计各货运公司的总货运量、占比,还要标记出当年占比最高的公司——这个用SQL的窗口函数就能轻松实现,我给你写个完整的解决方案:
完整SQL代码示例
WITH ShipperYearlyFreight AS ( SELECT YEAR(o.OrderDate) AS OrderYear, s.CompanyName AS ShipperName, SUM(o.Freight) AS TotalFreight, -- 这里按运费总和统计货运量,若要统计订单数换成COUNT(o.OrderID) SUM(SUM(o.Freight)) OVER (PARTITION BY YEAR(o.OrderDate)) AS YearTotalFreight FROM Orders o JOIN Shippers s ON o.ShipVia = s.ShipperID GROUP BY YEAR(o.OrderDate), s.CompanyName ) SELECT OrderYear, ShipperName, TotalFreight, ROUND((TotalFreight / YearTotalFreight) * 100, 2) AS FreightPercentage, CASE WHEN RANK() OVER (PARTITION BY OrderYear ORDER BY TotalFreight DESC) = 1 THEN 'X' ELSE '-' END AS TopShipperMarker FROM ShipperYearlyFreight ORDER BY OrderYear, TotalFreight DESC;
代码说明
- CTE部分:
ShipperYearlyFreight先按年份+货运公司分组,计算每个公司当年的总货运量(这里默认用运费总和,如果你要统计订单数量,把SUM(o.Freight)替换成COUNT(o.OrderID)即可),同时用窗口函数SUM(...) OVER (PARTITION BY YEAR(o.OrderDate))算出当年所有货运公司的总货运量,用来后续计算占比。 - 主查询部分:
- 计算占比并保留两位小数,用
ROUND函数处理精度; - 用
RANK()窗口函数按年份分组,对货运量降序排名,排名第一的公司标记为X,其余标记为-——如果同一年有多个公司货运量并列第一,RANK()会给它们都标记为X,要是你只想标记一个,可以换成ROW_NUMBER()(但会随机选一个并列的)。
- 计算占比并保留两位小数,用
如果你的现有代码有特定的逻辑或者用的是其他数据库(比如MySQL、PostgreSQL),可以告诉我,我再帮你调整细节~
内容的提问来源于stack exchange,提问作者Luis Enriquez




