首页 > 解决方案 > SQL - 百分比计算

问题描述

按类别(总价值和销售数量)报告2015年产品的销售情况。还要确定给定类别的销售额百分比代表该类别中每个产品的销售额。

到目前为止我的查询:

WITH sales AS
            (SELECT t1.category_name
            ,       t2.product_name
            ,      (t3.unit_price*t3.quantity) Total_sales
            ,      EXTRACT (YEAR FROM order_date) Year
            FROM categories t1
                    INNER JOIN
                 products t2 
                    ON t2.category_id=t1.category_id
                    INNER JOIN
                 order_details t3
                    ON t3.product_id=t2.product_id
                    INNER JOIN
                 orders t4
                    ON t4.order_id=t3.order_id
            WHERE EXTRACT (YEAR FROM order_date) = '2015'
            GROUP BY  t1.category_name
            ,         t2.product_name
            ,         (t3.unit_price*t3.quantity)
            ,         EXTRACT (YEAR FROM order_date)
            ORDER BY 1
                    )
SELECT s.category_name
,      s.product_name
,      SUM (Total_sales)
FROM sales s
GROUP BY s.category_name
,        s.product_name
ORDER BY 1

如何计算百分比?谢谢

标签: sqloraclejoinselectwindow-functions

解决方案


我认为您需要窗口函数-如果您未指定的数据库支持它们:

SELECT 
    c.category_name
    p.product_name
    SUM(od.unit_price * od.quantity) as total_sales
    1.0 * SUM(od.unit_price * od.quantity) 
        / SUM(SUM(od.unit_price * od.quantity)) OVER(PARTITION BY c.category_id)
        as category_sales_ratio
FROM categories c
INNER JOIN products t2 p    ON p.category_id = c.ategory_id
INNER JOIN order_details od ON od.product_id = p.product_id
INNER JOIN orders o         ON o.order_id = od.order_id
WHERE o.order_date >= '2015-01-01' AND o.order_date < '2016-01-01'
GROUP BY c.category_id, c.ategory_name, p.product_id, p.product_name
ORDER BY c.category_name, p.product_name

窗口总和计算整个类别的总销售额,您可以将其除以当前产品的销售额。

请注意,我以多种方式更改了您的查询:

  • 有意义的表别名使查询更易于编写、读取和维护

  • 在不转换的情况下过滤日期比使用日期函数更有效

  • 不需要子查询

  • 将相关的主键放在GROUP BY子句中总是一个好主意(如果两个不同的产品或类别具有相同的名称) - 另一方面,您在该子句中还有额外的不需要的列


推荐阅读