如何在SQL中执行百分比/总计?

时间:2009-07-26 06:58:47

标签: sql postgresql

我有一套典型的CUSTOMER / ORDERS表格,我希望显示特定客户负责的销售总百分比。我可以像这样得到系统中的订单总数:

SELECT COUNT(order_id) FROM orders

我可以得到客户订单的总数,如下:

SELECT COUNT(order_id) FROM orders WHERE cust_id = 541

如何将这些组合成一个返回特定客户销售百分比的查询?谢谢!

4 个答案:

答案 0 :(得分:35)

MySQL的:

SELECT ROUND(
  100.0 * (
      SUM(IF(cust_id = 541, 1, 0)) / COUNT(order_id)
  ), 1) AS percent_total
FROM orders;

修改

我想如果我注意到 postgres 标签会有所帮助。我认为这是一个MySQL问题。

的PostgreSQL:

SELECT ROUND(
  100.0 * (
      SUM(CASE WHEN cust_id = 541 THEN 1 ELSE 0 END) / COUNT(order_id)
  ), 1) AS percent_total
FROM orders;

P.S。我的PostgreSQL很生疏,所以如果MySQL查询适用于PostgreSQL,我想知道:)

修改2

我无法强调警惕下面的计数(*)建议。你通常希望用PostgreSQL避免这种情况。

答案 1 :(得分:9)

一种解决方案是使用嵌套查询 -

SELECT count(*) / (SELECT count(*) FROM orders)
FROM orders
WHERE cust_id = 541

答案 2 :(得分:-2)

select abc.item_name, sum(amount) as total
  from (select a.item_id, d.applicablefrom, a.item_name, a.final_item_status, d.rate, c.item_name as sub_item_name,
               b.sub_item_qty as itemqty, (b.sub_item_qty * d.rate) as amount 
          from tblitem_master a,
               tblitem_master c,
               tblitem_bom_master b,
               (select rate, applicablefrom, itemid
                  from tblperiodrates
                 where applicablefrom = (select max(applicablefrom) 
                                           from tblperiodrates
                                          where applicablefrom<='2005-5-18')) as d
         where a.item_id = b.item_id
           And b.sub_item_id = c.item_id
           and b.sub_item_id = d.itemid
           and a.final_item_status='f') as abc
 group by abc.item_name

答案 3 :(得分:-4)

select max([order].customerid) customer_id, count(orderid) customer_orders, (select count(orderid) from [order]) as total_orders,
100.0 * (count(orderid))/(select count(orderid) from [order])
from [order] inner join customer
on [order].customerid = customer.customerid
group by [order].customerid

为了说明流程,我在最终结果集中包含的列数超出了您的需要。 将计数(order_id)保存在临时变量中会更有效。 我不习惯postgres,我希望这只需要很少的修改。