Mysql 如何找到每个组的最小值并选择整行?
我有一个PROJECTS表,其中包含PROJECT\u ID、CUSTOMER\u ID、COMPANY\u ID和COST列。 一个客户可能在不同的公司有一个或多个项目。 我想要的是选择一个为每家公司创造最小收入的客户 例如如果表格如下所示Mysql 如何找到每个组的最小值并选择整行?,mysql,sql,database,Mysql,Sql,Database,我有一个PROJECTS表,其中包含PROJECT\u ID、CUSTOMER\u ID、COMPANY\u ID和COST列。 一个客户可能在不同的公司有一个或多个项目。 我想要的是选择一个为每家公司创造最小收入的客户 例如如果表格如下所示 project_id customer_id company_id cost 1 1 1 1000 2 1 1 100 3
project_id customer_id company_id cost
1 1 1 1000
2 1 1 100
3 2 1 3000
4 1 2 300
5 2 2 100
,预期的答案是:
(公司ID)1 |(客户ID)1 |(成本)1100
(公司ID)2 |(客户ID)2 |(成本)100
因为第一个客户总共生成1000+100=1100
我的查询如下所示:
SELECT TABLE1.company_id, TABLE1.customer_id, MIN(profit)
FROM (
SELECT company_id, customer_id, SUM(projects.cost) AS profit
FROM projects
GROUP BY company_id,customer_id
) AS TABLE1
GROUP BY TABLE1.company_id;
它计算最小利润,但CUSTOMER\u ID列中的ID总是错误的。如何在客户ID和每家公司的总利润之间建立联系?可能吗
感谢您的帮助。执行此操作的一种方法是“hack”,因为它使用字符串操作来获取所需的值:
SELECT cc.company_id,
SUBSTRING_INDEX(GROUP_CONCAT(cc.customer_id ORDER BY profit ASC), ',', 1) as customer_id,
MIN(profit)
FROM (SELECT p.company_id, p.customer_id, SUM(p.cost) AS profit
FROM projects p
GROUP BY p.company_id, p.customer_id
) cc
GROUP BY cc.company_id;
MySQL中的另一种选择如下:
SELECT p.company_id, p.customer_id, SUM(p.cost) AS profit
FROM projects p
GROUP BY p.company_id, p.customer_id
HAVING SUM(p.cost) = (SELECT SUM(p2.cost)
FROM projects p2
WHERE p2.company_id = p.company_id
ORDER BY SUM(p2.cost) ASC
LIMIT 1
);
这两个版本略有不同:
- 第一个客户将始终返回一个客户,即使有联系
- 第一个将
转换为字符串公司id
- 第一个可能会出现溢出情况,因为
的中间结果的长度由系统参数控制group_concat()
拥有
和全部
SELECT p.company_id,
p.customer_id,
SUM(p.cost) AS profit
FROM projects p
GROUP BY p.company_id, p.customer_id
HAVING SUM(p.cost) <= ALL(
SELECT SUM(p2.cost)
FROM projects p2
WHERE p2.company_id = p.company_id
GROUP BY p2.customer_id
)
选择p.company\u id,
p、 客户识别码,
作为利润的总额(p.成本)
来自项目p
按p.公司id、p.客户id分组
具有总和(p.成本)例如:
将表与当前派生表(也称为子查询)联接
SELECT a.*
FROM
( SELECT customer_id
, company_id
, SUM(cost) total
FROM my_table
GROUP
BY customer_id
, company_id
) a
JOIN
( SELECT company_id
, MIN(total) min_total
FROM
( SELECT customer_id
, company_id
, SUM(cost) total
FROM my_table
GROUP
BY customer_id
, company_id
) x
GROUP
BY company_id
) b
ON b.company_id = a.company_id
AND b.min_total = a.total;