我有两个表。
表 1 包含订单和客户代码。表 2 包含带有问题代码的订单。
我需要能够从表 1 中按客户返回不同的订单计数,以及表 2 中问题代码为"F"的订单的不同客户计数。 然后最后一个字段将是两者的比率。 问题计数/订单计数。 我使用的是 AS400/DB2 SQL。 任何帮助将不胜感激。
Customer ORcnt IScnt IssueRatio
cust1 450 37 0.082
cust2 255 12 0.047
cust3 1024 236 0.230
cust4 450 37 0.082
您可以使用问题表的outer join
,并使用distinct
count
。 如下所示,具体取决于您的表定义:
select o.customercode,
count(distinct o.orderid),
count(distinct i.orderid),
count(distinct i.orderid)/count(distinct o.orderid) ratio
from table1 o
left join table2 i on o.orderid = i.orderid and i.issuecode = 'F'
group by o.customercode
一些数据库需要将比率转换为小数 - 我不确定db2
. 如果需要,一种方法是将结果乘以 1.0:
1.0*count(distinct i.orderid)/count(distinct o.orderid)
此外,您可能不需要带有count
的distinct
- 取决于您的数据...
理解正确,这是一个join
查询以及条件聚合:
select t1.customer, count(*) as ordercnt,
sum(case when issuecode = 'F' then 1 else 0 end) as issuecnt,
avg(case when issuecode = 'F' then 1.0 else 0 end) as issuep
from table1 t1 join
table2 t2
on t1.orderid = t2.orderid
group by t1.customer;
我正在使用一些子查询来执行此操作,以使其在描述您提出的问题方面更具可读性。 SGEDDES的解决方案可能也可以工作(并且可能表现得更好),具体取决于数据的精确结构。
SELECT t.customer,
count(t.orderID_All),
count(t.orderID_F),
count(t.orderID_F)/count(t.orderID_All)
FROM
(SELECT orders.customer,
orders.orderID AS orderID_All,
issues.orderID AS orderID_F /*assuming primary/unique key is customer-orderID*/
FROM table1 orders
LEFT OUTER JOIN /*you want *all* orders on the left and just orders w/ 'F' on the right*/
(SELECT DISTINCT orderID
FROM table2
WHERE issuecode = 'F') issues ON orders.orderID = issues.orderID) t
GROUP BY t.customer;