【问题标题】:Finding a percentage per row of a grouped table查找分组表的每行百分比
【发布时间】:2016-08-06 03:58:50
【问题描述】:

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

【问题讨论】:

  • 能否提供样本数据?
  • 提供了上面表格的一个小样本。

标签: sql


【解决方案1】:

类似于下面的内容可能会得到您正在寻找的东西。当某些产品 ID 不满足条件时,该行将在列中显示为空。

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

【讨论】:

  • 这看起来很有希望!我的实际表涉及几个连接,因此使用起来会有点复杂,但希望它可以工作!
  • 最坏的情况下,您始终可以将上述所有内容作为整个语句中的子查询,然后可能加入 productID。请注意不要无意中使用其他列来稀释组。
【解决方案2】:

这可能是使用带有临时表的 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`

【讨论】:

  • 在这种情况下,'Total' 不是表中的总行数吗?我需要的“总数”是表中每种产品的该产品的订单总数。
猜你喜欢
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2019-10-26
  • 2013-08-15
  • 2020-11-22
相关资源
最近更新 更多