内部联接多个SQL表并执行计算
我需要在1996年9月计算每种产品在总收入中所占的比例。数据在3个表中 表1:订单详情 表2:产品 表3:订单 我想步骤是: 内部将OrderDetails与Order by OrderID连接,以仅显示1996年9月的订单 将步骤1中的结果与ProductID中的Products进行内部连接,并计算每个产品的收入占总收入的百分比 我已经完成了第一步内部联接多个SQL表并执行计算,sql,Sql,我需要在1996年9月计算每种产品在总收入中所占的比例。数据在3个表中 表1:订单详情 表2:产品 表3:订单 我想步骤是: 内部将OrderDetails与Order by OrderID连接,以仅显示1996年9月的订单 将步骤1中的结果与ProductID中的Products进行内部连接,并计算每个产品的收入占总收入的百分比 我已经完成了第一步 SELECT Orders.OrderID, Orders.OrderDate, OrderDetails.Quantit
SELECT
Orders.OrderID,
Orders.OrderDate,
OrderDetails.Quantity,
OrderDetails.ProductID
FROM
Orders
INNER JOIN
OrderDetails ON Orders.OrderID = OrderDetails.OrderID
WHERE
OrderDate LIKE '1996-09%';
预期结果:
OrderID OrderDate Quantity ProductID
-----------------------------------------
10295 1996-09-02 4 56
10296 1996-09-03 12 11
10296 1996-09-03 30 16
10296 1996-09-03 15 69
10297 1996-09-04 60 39
但我不知道怎么做第二步。有什么建议吗?多谢各位 使用窗口功能:
SELECT od.ProductID,
SUM(od.Quantity),
SUM(od.Quantity) * 1.0 / SUM(SUM(od.Quantity)) OVER () as ratio
FROM Orders o INNER JOIN
OrderDetails od
ON o.OrderID = od.OrderID
WHERE o.OrderDate >= '1996-09-01' AND o.OrderDate < '1996-10-01'
GROUP BY od.ProductID;
看起来W3Cschool的交互式SQL实践不支持窗口函数。此外,我没有找到定义变量的方法,所以不得不两次提到相同的常量年份和月份。在现实生活中,我会建议使用分析函数,或者至少为几个地方使用的值声明一个变量 不管怎样,下面的代码似乎可以满足您的需要:
SELECT
od.ProductID,
MIN(o.OrderDate) as SalesStart,
MAX(o.OrderDate) as SalesEnd,
SUM(od.Quantity) as SoldQty,
SUM(od.Quantity * p.Price) as SoldAmt,
SUM(od.Quantity * p.Price) * 1.0 /
(
SELECT SUM(odAll.Quantity * pAll.Price)
FROM OrderDetails odAll
INNER JOIN Orders as oAll
ON oAll.OrderID = odAll.OrderID
INNER JOIN Products as pAll
ON odAll.ProductID = pAll.ProductID
WHERE oAll.OrderDate LIKE '1996-09%') as PortionInTotalSales
FROM Orders as o
INNER JOIN OrderDetails as od
ON o.OrderID = od.OrderID
INNER JOIN Products as p
ON od.ProductID = p.ProductID
WHERE o.OrderDate LIKE '1996-09%'
GROUP BY od.ProductID
你在用什么数据库管理系统?我在用W3Cschool的交互式SQL实践谢谢!但是我有一个语法错误。它只是说语法错误,并没有具体告诉我错误是什么谢谢,但我想计算每个项目的收入占所有收入的百分比。因此,还需要在“产品”表中使用“价格”列。
OrderID OrderDate Quantity ProductID
-----------------------------------------
10295 1996-09-02 4 56
10296 1996-09-03 12 11
10296 1996-09-03 30 16
10296 1996-09-03 15 69
10297 1996-09-04 60 39
SELECT od.ProductID,
SUM(od.Quantity),
SUM(od.Quantity) * 1.0 / SUM(SUM(od.Quantity)) OVER () as ratio
FROM Orders o INNER JOIN
OrderDetails od
ON o.OrderID = od.OrderID
WHERE o.OrderDate >= '1996-09-01' AND o.OrderDate < '1996-10-01'
GROUP BY od.ProductID;
SELECT
od.ProductID,
MIN(o.OrderDate) as SalesStart,
MAX(o.OrderDate) as SalesEnd,
SUM(od.Quantity) as SoldQty,
SUM(od.Quantity * p.Price) as SoldAmt,
SUM(od.Quantity * p.Price) * 1.0 /
(
SELECT SUM(odAll.Quantity * pAll.Price)
FROM OrderDetails odAll
INNER JOIN Orders as oAll
ON oAll.OrderID = odAll.OrderID
INNER JOIN Products as pAll
ON odAll.ProductID = pAll.ProductID
WHERE oAll.OrderDate LIKE '1996-09%') as PortionInTotalSales
FROM Orders as o
INNER JOIN OrderDetails as od
ON o.OrderID = od.OrderID
INNER JOIN Products as p
ON od.ProductID = p.ProductID
WHERE o.OrderDate LIKE '1996-09%'
GROUP BY od.ProductID