【问题标题】:SQL -percent calculationSQL - 百分比计算
【发布时间】:2020-10-11 18:17:50
【问题描述】:

按类别(总价值和 销售量)。还要确定销售价值的百分之几 对于给定类别,表示该类别中每个产品的销售额。

到目前为止我的查询:

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

如何计算百分比?谢谢

【问题讨论】:

  • 表格数据示例,查询结果示例?
  • 类别名称 |产品名称 | 2015 年销售额 ($) | 2015 年销售额百分比(类别)|数量(单位)| - 结果示例
  • 类别 - t1 产品 t2 订单详情 t3 订单 t4

标签: sql oracle join select window-functions


【解决方案1】:

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

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 子句中总是一个好主意(以防两个不同的产品或类别具有相同的名称) - 另一方面,您在该子句中还有额外的不需要的列

【讨论】:

  • 我的数据库在Oracle中叫Northwind
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-12-17
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多