php - PHP MySQL Group by 多个条件在一个独特的情况下
问题描述
我正在处理由另一个部门管理的数据,并且我得到了重复。
有 3 种不同的唯一标识:
Order Number
Company Name
Company Entity
有时它的公司名称相同但订单号不同。
有时它的公司名称相同,但公司实体不同。
有时它的订单号相同,但公司名称不同。
有时它的订单号相同,但公司实体不同。
有时它是同一公司实体,但订单号不同。
有时它的公司实体相同,但公司名称不同。
有时公司名称缩写为 Apple、Apple Inc、Apple NYC 等。
下面我有一个包含示例数据的表格:
CompanyName CompanyEntity OrderNumber
Apple 123 555123
Apple 123 555123
Telsa 888 444444
Telsa 777 222222
Apple NYC 103 544523
Stack 222 511523
Stack 222 144523
我需要按公司名称或公司实体或订单号进行分组。
我试过:
$query = "SELECT
nextgenorders2.nextgenorder_ordernumber,
nextgenorders2.nextgenorder_serial,
nextgenorders2.nextgenorder_company_entity,
nextgenorders2.nextgenorder_companyname,
nextgenorders2.nextgenorder_deliverydate,
FROM nextgenorders2
WHERE nextgenorders2.nextgenorder_deliverydate='2020-11-11'
GROUP BY nextgenorders2.nextgenorder_companyname,
nextgenorders2.nextgenorder_company_entity,
nextgenorders2.nextgenorder_ordernumber
";
该查询产生:
CompanyName CompanyEntity OrderNumber
Apple 123 555123
Telsa 888 444444
Telsa 777 222222
Apple NYC 103 544523
Stack 222 511523
如果该行具有相同的公司名称、公司实体和订单号,则将其放入一个组中。
如果该行没有相同的公司实体、公司名称和订单号,则不会将其放入组中。
我希望查询产生这个:
CompanyName CompanyEntity OrderNumber
Apple 123 555123
Telsa 888 444444
Stack 222 144523
但由于有多个公司名称缩写,我会选择这个:
CompanyName CompanyEntity OrderNumber
Apple 123 555123
Telsa 777 222222
Apple NYC 103 544523
Stack 222 511523
感谢您的帮助。
解决方案
你可以做这样的事情
但是对于您拥有的每一列,您都需要决定如何处理它。像 MIN(n2.nextgenorder_company_entity),但如果你想保留所有你可以使用 GROUP_CONCAT 例如
CREATE TABLE nextgenorders2 (`nextgenorder_companyname` varchar(9), `nextgenorder_company_entity` int, `nextgenorder_ordernumber` int, nextgenorder_deliverydate date) ; INSERT INTO nextgenorders2 (`nextgenorder_companyname`, `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate) VALUES ('Apple', 123, 555123,'2020-11-11'), ('Apple', 123, 555123,'2020-11-11'), ('Telsa', 888, 444444,'2020-11-11'), ('Telsa', 777, 222222,'2020-11-11'), ('Apple NYC', 103, 544523,'2020-11-11'), ('Stack', 222, 511523,'2020-11-11'), ('Stack', 222, 144523,'2020-11-11') ;
✓ ✓
SELECT GROUP_CONCAT(n2.nextgenorder_ordernumber), #n2.nextgenorder_serial, MIN(n2.nextgenorder_company_entity), n2.nextgenorder_companyname, n2.nextgenorder_deliverydate FROM (SELECT REPLACE(`nextgenorder_companyname`,'Apple NYC','Apple') `nextgenorder_companyname` , `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate FROM nextgenorders2) n2 WHERE n2.nextgenorder_deliverydate='2020-11-11' GROUP BY n2.nextgenorder_companyname ,n2.nextgenorder_deliverydate #,n2.nextgenorder_ordernumber
GROUP_CONCAT(n2.nextgenorder_ordernumber) | 最小值(n2.nextgenorder_company_entity)| nextgenorder_companyname | nextgenorder_deliverydate :---------------------------------------------------- | ----------------------------------: | :------------------------ | :------------------------ 555123,555123,544523 | 103 | 苹果 | 2020-11-11 511523,144523 | 222 | 堆栈 | 2020-11-11 444444,222222 | 第777章 特斯拉 | 2020-11-11
db<>在这里摆弄
更多解释
查询的核心是
(SELECT REPLACE(`nextgenorder_companyname`,'Apple NYC','Apple') `nextgenorder_companyname`
, `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate
FROM nextgenorders2) n2
这将替换公司名称,以便在这种情况下 Apple NYC 变为 Apple,这有点耗时,因此您应该考虑创建一个列 Mother company,但如果只有几个,您可以像我一样手动制作。
Group By 被简化为只有公司名称,因为这是我们的主要目标,要获取所有关于此的信息,交货日期在那里,因为通常您会寻找整个星期,所以如果您决定查看它已经是 group by两个或多个日期。
选择只是一个例子,因为不知道,你在搜索什么你的查询没有给我任何线索。
但是基础是针对每个列的,而不是在 Group By 子句中,您需要一个聚合函数,以便开发人员必须为每一列决定他想要查看的数据。
就我而言,如果您只需要 COUNT 个订单,我决定查看所有订单号。
该实体不在 Group by 中,因为如果您只想查看公司的整体,我不明白为什么您根本需要任何实体,最小值只是因为您选择了 Tesla 777 而不是 888,但是我不知道你需要它做什么
推荐阅读
- twilio - Twilio 通话时长
- .net - 只使用 Stream dispose 和 ZipArchive 不 dispose,能否正确清理资源?
- r - 为什么在R中创建数据框时数据重复?
- php - 如何处理等于所有访问者的静态mysql查询内容
- angular - 角度 9 形式的两种方式绑定
- excel-formula - COUNTIFS 或 SUMPRODUCT :索引条件与字符串匹配的范围内的非空白值的计数
- ffmpeg - FFMPEG:2x2 网格相机流到 Youtube
- python - 如何使用应用工厂将 Flask 应用部署到 Google Cloud(App Engine),以及如何编写 app.yaml 文件?
- sed - 用双引号替换变量 num - SED
- flutter - 如何从此迭代数据中求和整数