You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动