我有一组典型的CUSTOMER/ORDERS表,并且我想展示一个特定客户所负责的总销售额百分比。我可以像这样获取系统中订单的总数量:
SELECT COUNT(order_id) FROM orders
我可以这样获取客户下的订单总数:
SELECT COUNT(order_id) FROM orders WHERE cust_id = 541
我该如何将这些内容合并为一个查询,并返回特定客户销售额的百分比?谢谢!我有一组典型的CUSTOMER/ORDERS表,并且我想展示一个特定客户所负责的总销售额百分比。我可以像这样获取系统中订单的总数量:
SELECT COUNT(order_id) FROM orders
我可以这样获取客户下的订单总数:
SELECT COUNT(order_id) FROM orders WHERE cust_id = 541
我该如何将这些内容合并为一个查询,并返回特定客户销售额的百分比?谢谢!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)::numeric / COUNT(order_id)
), 1) AS percent_total
FROM orders;
附言:我的PostgreSQL有点生疏,如果MySQL查询在PostgreSQL上也可行,我想知道 :)
编辑2
我无法强调足够要谨慎使用下面的count(*)建议。通常情况下,你应该避免在PostgreSQL中使用它。
一个解决方案是使用嵌套查询 -
SELECT count(*) / (SELECT count(*) FROM orders)
FROM orders
WHERE cust_id = 541
COUNT(*)
和COUNT(1)
是一样的。而且,hobodave
,你的解决方案是等效的,因为COUNT(order_id)
的意思是“计算order_id非空的行数”。由于order_id可能永远不会为空,所以它与COUNT(*)
完全相同。不,user80168
,这不需要进行表扫描和索引扫描。如果你已经在做序列扫描,就没有必要再扫描索引了。 - jbgselect 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
[
和]
是SQL中非法字符)。 - user330315
SELECT ROUND(100.0 * (SUM(CASE WHEN cust_id = 541 THEN 1 ELSE 0 END)::DECIMAL / COUNT(order_id)), 1) AS percent_total FROM orders;
- Michael Rushorders
中每行的order_id
都不为空(这似乎很可能),那么COUNT(*)
和COUNT(order_id)
是相同的。COUNT(*)
表示“计算输入行数”,而COUNT(foo)
表示“计算foo
非空值的输入行数”。 - jbgavg
代替sum
+count
,以使代码稍微更短(例如avg(case when cust_id = 541 then 1 else 0 end)*100
)。这样做会降低效率吗? - Franco