结合两个查询并获得计数的总和

Posted

技术标签:

【中文标题】结合两个查询并获得计数的总和【英文标题】:Combining two queries and getting the sum of count 【发布时间】:2021-04-10 21:24:42 【问题描述】:

我有两个不同的查询,每个查询都完成了我需要的一半工作。如何组合它们。

orders 表有orderNumbercustomerNumbercustomers 表有customerNumbersalesRepEmployeeNumberorderdetails 有多个相同的orderNumber 行显示不同商品的价格和数量)。

(计算每个销售代表拥有的不同客户的订单数量)

select c.salesRepEmployeeNumber, count(*)
from customers c
inner join orders o1
on c.customerNumber = o1.customerNumber
group by c.salesRepEmployeeNumber;

(计算每个销售代表的收入)

select c.salesRepEmployeeNumber, sum(o2.priceEach*o2.quantityOrdered) as "Revenue"
from customers c
inner join orders o1
on c.customerNumber = o1.customerNumber
inner join orderdetails o2
on o1.orderNumber = o2.orderNumber
group by c.salesRepEmployeeNumber;

我需要查询以了解员工编号、订单数量和收入。我试过了

select sum(o2.priceEach*o2.quantityOrdered) as "Revenue", c.salesRepEmployeeNumber, count(*)
from customers c
inner join orders o1
on c.customerNumber = o1.customerNumber
inner join orderdetails o2
on o1.orderNumber = o2.orderNumber
group by c.salesRepEmployeeNumber;

但它会返回订单中的商品/产品数量(例如,1 个订单包含三个产品)

【问题讨论】:

了解UNION 【参考方案1】:
SELECT salesRepEmployeeNumber,
       t1.`count(*)` AS `count`,
       t2.Revenue
FROM (complete text of 1st query) AS t1
LEFT JOIN (complete text of 2nd query) AS t2 USING (salesRepEmployeeNumber)

完整文本的意思是“没有最后的分号”。

如果您的数据保证第二个查询产生的行数等于第一个查询产生的行数,那么您可以不使用 LEFT,而是使用 INNER 连接。


也测试一下

select c.salesRepEmployeeNumber
     , COUNT(DISTINCT o1.id) AS orders_count
     , sum(o2.priceEach*o2.quantityOrdered) as "Revenue"
  from customers c
  join orders o1
    on c.customerNumber = o1.customerNumber
  join orderdetails o2
    on o1.orderNumber = o2.orderNumber
 group 
    by c.salesRepEmployeeNumber;

其中o1.idorders 表的主键表达式(或任何唯一的非NULL 列/表达式/索引)。

【讨论】:

以上是关于结合两个查询并获得计数的总和的主要内容,如果未能解决你的问题,请参考以下文章

分组数据框并获得总和和计数?

如何使用嵌套案例查询获得不同的计数?

来自两个不同表的Mysql计数和总和

Django:结合来自两个过滤器查询的两个计数注释

同一表的不同列的计数总和

Laravel Eloquent 如何根据计数获得关系总和