Как делать проценты/всего в SQL?
У меня есть типичный набор таблиц CUSTOMER/ORDERS, и я хочу отобразить общий процент продаж, за который отвечает конкретный клиент. Я могу получить общее количество заказов в системе следующим образом:
SELECT COUNT(order_id) FROM orders
И я могу получить общее количество заказов, сделанных клиентом, таким образом:
SELECT COUNT(order_id) FROM orders WHERE cust_id = 541
Как я могу объединить их в один запрос, который возвращает процент продаж для конкретного клиента? Спасибо!
Ответы
Ответ 1
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
Я не могу подчеркнуть достаточно, чтобы опасаться предложения count (*) ниже. Обычно вы хотите избежать этого с помощью PostgreSQL.
Ответ 2
Одним из решений является использование вложенного запроса -
SELECT count(*) / (SELECT count(*) FROM orders)
FROM orders
WHERE cust_id = 541
Ответ 3
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
Ответ 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, я надеюсь, что это работает с минимальными изменениями.