查找分组表格的每行百分比

时间:2016-08-05 19:19:31

标签: sql

我有一张包含许多不同产品订单的表格。目前,我可以使用以下查询计算每个产品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

2 个答案:

答案 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