健康一贴灵,专注医药行业管理信息化

AI太历害了,这种SQL我是1小时才能调出来,统计每个产品的前三名

 

WITH raw_data AS (
    -- 步骤1:读取原始数据,补全产品名称(处理合并单元格),过滤合计行
    SELECT 
        COALESCE(yjlx_wlmc, 
                 LAG(yjlx_wlmc) OVER (ORDER BY (SELECT 1))) AS 产品名称,
        yjlx_gysmc AS 单位名称,
        yjlx_je AS 销售额
    FROM 
        yjlx  -- 替换为实际表名
    WHERE 
        yjlx_gysmc <> '合计'  
        AND yjlx_wlmc <> '合计'  
),
ranked_sales AS (
    -- 步骤2:按产品分组,动态计算排名(按销售额降序)
    SELECT 
        产品名称,
        单位名称,
        销售额,
        -- 动态生成排名(数字类型)
        ROW_NUMBER() OVER (
            PARTITION BY 产品名称 
            ORDER BY 销售额 DESC
        ) AS 排名
    FROM 
        raw_data
),
top_three AS (
    -- 步骤3:筛选每个产品排名前三的单位
    SELECT 
        产品名称,
        单位名称,
        销售额,
        排名::text  -- 转为文本类型,方便后续 UNION
    FROM 
        ranked_sales
    WHERE 
        排名 <= 3
),
product_totals AS (
    -- 步骤4:计算每个产品前三家单位的销售额合计
    SELECT 
        产品名称,
        '合计' AS 单位名称,
        SUM(销售额) AS 销售额,
        '' AS 排名  -- 用空文本填充,保持类型一致
    FROM 
        top_three
    GROUP BY 
        产品名称
)
-- 步骤5:合并结果(数据行 + 合计行),按 Excel 样式排序
SELECT 
    产品名称,
    单位名称,
    销售额,
    排名
FROM (
    SELECT * FROM top_three
    UNION ALL
    SELECT * FROM product_totals
) AS combined
ORDER BY 
    产品名称, 
    (CASE WHEN 单位名称 = '合计' THEN 2 ELSE 1 END),  
    (CASE WHEN 排名 <> '' THEN 排名::int ELSE 999 END);  -- 排序时转回数字

 

posted @ 2025-07-01 13:28  一贴灵  阅读(13)  评论(0)    收藏  举报
学以致用,效率第一