我有一张包含许多不同产品订单的表格。目前,我可以使用以下查询计算每个产品ID的订单数量:
SELECT ProductId, COUNT(*) as NumOrders from Orders
GROUP BY ProductId;
这会给出一个表格,列出所有产品ID和该产品的订单数量。我还可以通过添加一个简单的where子句来计算符合特定条件的订单数量:
SELECT ProductId, COUNT(*) as NumCriteria from Orders
WHERE HasCriteria = 1
GROUP BY ProductId;
这给了我一个类似的产品ID和该产品订单数量表,但由于并非所有订单都符合该标准,因此数量较少。
我需要做的是在单个查询中运行两个计数,以便显示符合条件的订单数量和每个产品ID的订单总数,然后还计算适合该订单的订单百分比每个产品ID的标准。基本上是这样的:
SELECT Product ID,
COUNT( *meets criteria* ),
COUNT( *total* ),
( COUNT( *meets criteria* ) * 100 / COUNT( *total* ) )
所以我的输出给了我这样的东西:
ProductID | NumCriteria | NumOrders | Percent
0001 | 5 | 10 | 50
0002 | 4 | 20 | 20
0003 | 2 | 6 | 33
到目前为止,我所看到的所有计算某个百分比的方法都是用于计算表中符合条件的行的百分比,但我需要表中每个不同产品ID的百分比。有没有办法在一个查询中执行此操作?
编辑:原始表是包含订单ID,产品ID和客户信息的订单。相同的产品出现在多个订单中。一个简短的例子是:
Order ID | Product ID | Other info...
001 | 0002 | ...
002 | 0002 | ...
003 | 0001 | ...
004 | 0003 | ...
005 | 0001 | ...
006 | 0002 | ...
007 | 0004 | ...
因此该表上第一个查询的结果是:
Product ID | NumOrders
0001 | 2
0002 | 3
0003 | 1
0004 | 1
答案 0 :(得分:1)
可以使用带有临时表的cros join来获取总数
可以使用iiner连接和临时表来获取总数
SELECT a.`Product ID`
, COUNT(a*) AS `count`
, t.cnt as Total
FROM Orders a
INNER JOIN ( select `Product ID`, count(distinct Order ID) as total
from orders
group by `Product ID`) t on a.`Product ID` = t.`Product ID`
GROUP BY a.Product ID`
答案 1 :(得分:1)
类似下面的内容可能会得到你想要的东西。如果某些productID的条件未满足,则该行在列中显示为空。
SELECT
A.Product ID,
B.NumCriteria,
A.count(*) as total,
((B.NumCriteria*100)/A.count(*))
FROM
Orders as A
LEFT JOIN (SELECT
ProductID,
count(*) as NumCriteria
FROM
Orders
WHERE
HasCriteria = 1
GROUP BY ProductID) as B
ON A.ProductID = B.ProductID
GROUP BY ProductID