【问题标题】:Returning total percentage within a group返回组内的总百分比
【发布时间】:2019-02-06 02:08:56
【问题描述】:

使用此示例数据库:https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_avg

我正在尝试创建一个表格,返回每个国家/地区的每个类别的订单百分比。所以理想情况下它看起来像这样:

Country   CategoryName  Num_of_orders  % of orders
Argentina  Confections       1            0.50
Argentina   Produce          1            0.50
Austria    Beverages         5            0.17
Austria    Condiments        6            0.21

因此,由于阿根廷只有两个订单,因此糖果将占 50%,因此也会生产。

到目前为止,我得到的最接近的是返回总订单数的百分比,但忽略了国家/地区。

SELECT c.country, ca.categoryname, count(o.orderid) as Num_of_orders, 
    count(*)/(select 1.0*count(*) from orders) as percentage
from orders as o
join customers as c on c.customerid = o.customerid
join orderdetails as od on od.orderid = o.orderid
join products as p on p.productid = od.productid
join categories as ca on ca.categoryid = p.categoryid
group by 1, 2

任何帮助将不胜感激。

【问题讨论】:

  • 我认为它工作正常..你觉得有什么问题
  • 我正在尝试按类别获取每个国家/地区的订单百分比。所以在理想情况下,它会返回:阿根廷 |甜点 | 1 | 0.50 (50%) 相对于:阿根廷 |甜点 | 1 | 0.0051 ( >0%)
  • 您使用的是哪个 dbms? (那个GROUP BY 1, 2 不是ANSI SQL...)

标签: sql


【解决方案1】:

我认为您想要类似以下的内容,它在子查询中按国家/地区选择计数,而不是所有订单的计数。

SELECT c.country, ca.categoryname, count(o.orderid) as Num_of_orders, 
    count(*)/(select 1.0*count(*) from orders o2 join customers c2 on c2.customerid = o2.customerid join orderdetails od2 on od2.orderid = o2.orderid WHERE c2.country=c.country) as percentage
from orders as o
join customers as c on c.customerid = o.customerid
join orderdetails as od on od.orderid = o.orderid
join products as p on p.productid = od.productid
join categories as ca on ca.categoryid = p.categoryid
group by 1, 2

此版本适用于您的示例数据库,但根据您的实际查询所针对的数据库,您可能会考虑对分区而不是子查询进行计数,或者至少使用公用表表达式来避免编写一些连接像我在这里做的两倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多