sql-percent计算

t5fffqht  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(346)

按类别(总价值和销售数量)报告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

如何计算%?谢谢您

olqngx59

olqngx591#

我认为您需要窗口函数—如果您没有指定的数据库支持这些函数:

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 子句(如果两个不同的产品或类别具有相同的名称)-另一方面,在该子句中还有additiona uneeded列

相关问题