You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于子查询结果计算厂商各产品型号数量占比?

问题描述

现有如下SQL查询及对应结果,需要计算每个厂商(maker)下,每种产品类型(type)的型号数量占该厂商总型号数量的百分比(即各类型型号数除以该厂商的型号总数),并得到指定格式的结果。

原查询语句

SELECT 
    maker, p.type, COUNT(DISTINCT pc.model) pcs
FROM 
    Product p 
INNER JOIN 
    Pc pc ON p.model = pc.model
GROUP BY 
    maker, p.type

UNION

SELECT 
    maker, p.type, COUNT(DISTINCT l.model) pcs
FROM
    Product p 
INNER JOIN 
    Laptop l ON p.model = l.model
GROUP BY 
    maker, p.type

UNION

SELECT 
    maker, p.type, COUNT(DISTINCT pr.model) pcs
FROM 
    Product p 
INNER JOIN 
    Printer pr ON p.model = pr.model
GROUP BY 
    maker, p.type

原查询结果

makertypemodel
ALaptop2
APC2
APrinter3
BLaptop1
BPC1
CLaptop1
DPrinter2
EPC1
EPrinter1

解决方案SQL

将原查询作为子查询,结合窗口函数SUM() OVER (PARTITION BY maker)计算每个厂商的总型号数,再计算百分比并格式化保留两位小数:

SELECT
    maker,
    type,
    ROUND((pcs * 100.0) / SUM(pcs) OVER (PARTITION BY maker), 2) AS model
FROM (
    SELECT 
        maker, p.type, COUNT(DISTINCT pc.model) pcs
    FROM 
        Product p 
    INNER JOIN 
        Pc pc ON p.model = pc.model
    GROUP BY 
        maker, p.type

    UNION

    SELECT 
        maker, p.type, COUNT(DISTINCT l.model) pcs
    FROM
        Product p 
    INNER JOIN 
        Laptop l ON p.model = l.model
    GROUP BY 
        maker, p.type

    UNION

    SELECT 
        maker, p.type, COUNT(DISTINCT pr.model) pcs
    FROM 
        Product p 
    INNER JOIN 
        Printer pr ON p.model = pr.model
    GROUP BY 
        maker, p.type
) AS product_counts
ORDER BY maker, type;

期望结果

makertypemodel
ALaptop28.57
APC28.57
APrinter42.86
BLaptop50.00
BPC50.00
CLaptop100.00
DPrinter100.00
EPC50.00
EPrinter50.00

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:23