sql - 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
如何计算百分比?谢谢
解决方案
我认为您需要窗口函数-如果您未指定的数据库支持它们:
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
子句中总是一个好主意(如果两个不同的产品或类别具有相同的名称) - 另一方面,您在该子句中还有额外的不需要的列
推荐阅读
- javascript - How can I use tablesorter to sort multiple groups of rows separately?
- solid-principles - 这个例子如何违反 LSP,从而导致违反 OCP?
- python - 如何在 keras 中使用 batch_size 时识别张量的形状(initial_value 必须具有指定的形状)
- java - 卷曲不一致的行为 - CLI 与 Java 进程
- android - Firebase 实时数据库不显示显示的项目
- html - 在 SDTT 中验证 Schema.org 的“问题”标记
- django - nginx 从 html 服务而不是 gunicorn
- machine-learning - 无法导入 en_core_web_sm 或 Spacy
- python - 如何在 Python 中从列表中检索特定项目并将其写入文件
- python - 石榴无法检测到现有的pygraphviz