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); -- 排序时转回数字
活到老,学到老。

浙公网安备 33010602011771号