porcentajes - ¿Cómo hacer el porcentaje/total en SQL?
porcentajes en postgresql (4)
Tengo un conjunto típico de tablas de CLIENTES / PEDIDOS y quiero mostrar el porcentaje total de ventas de un cliente en particular que es responsable. Puedo obtener el número total de pedidos en el sistema así:
SELECT COUNT(order_id) FROM orders
Y puedo obtener el número total de pedidos realizados por el cliente de esta manera:
SELECT COUNT(order_id) FROM orders WHERE cust_id = 541
¿Cómo puedo combinarlos en una sola consulta que devuelva el porcentaje de ventas para un cliente en particular? ¡Gracias!
MySQL:
SELECT ROUND(
100.0 * (
SUM(IF(cust_id = 541, 1, 0)) / COUNT(order_id)
), 1) AS percent_total
FROM orders;
Editar
Supongo que ayuda si me hubiera dado cuenta de la etiqueta postgres . Pensé que era una pregunta de 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;
PS Mi PostgreSQL está oxidado, por lo que si la consulta de MySQL funciona en PostgreSQL me gustaría saber :)
Editar 2
No puedo enfatizar lo suficiente como para desconfiar de la sugerencia del conde (*) a continuación. Generalmente quieres evitar esto con PostgreSQL.
Una solución es utilizar una consulta anidada
SELECT count(*) / (SELECT count(*) FROM orders)
FROM orders
WHERE cust_id = 541
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
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
Para ilustrar el flujo, he incluido más columnas de las que necesita ver en el conjunto de resultados finales. Mantener el conteo (order_id) en una variable temporal será más eficiente. No estoy acostumbrado a postgres, espero que esto funcione con una modificación mínima.