MySQL如何按行分组统计多列,实现每个关键词一行展示各商家结果数
解决方案
完全可以实现该需求,使用条件聚合做行转列即可,因为商家数量仅10个固定,不需要用到动态SQL,直接写对应判断逻辑即可。
现有查询的问题
你当前写的查询存在以下问题:
- 仅按
kwd.ID分组,查询结果中包含非分组字段MERCHANT_ID、RESULTS,不符合严格SQL模式的要求,且无法将多商家的结果拆分到独立列 - 日期过滤的格式错误,
DATE字段是日期类型,需用字符串格式传值,另外你示例数据的统计日期是2021-07-06,过滤条件写20210705查不到任何结果 GROUP BY逻辑和需求的行转列要求不匹配
正确查询语句
假设MERCHANT_ID=1对应Amazon、MERCHANT_ID=2对应eBay,剩下的8个商家按ID对应关系依次补全CASE WHEN逻辑即可:
SELECT kwd.KEYWORD AS KWD, SUM(CASE WHEN mss.MERCHANT_ID = 1 THEN mss.RESULTS ELSE 0 END) AS `RESULTS Amazon`, SUM(CASE WHEN mss.MERCHANT_ID = 2 THEN mss.RESULTS ELSE 0 END) AS `RESULTS eBay` -- 其余商家按上面的格式补全,比如MERCHANT_ID=3就加下一行 -- SUM(CASE WHEN mss.MERCHANT_ID = 3 THEN mss.RESULTS ELSE 0 END) AS `RESULTS 其他商家名` FROM keywords kwd LEFT JOIN stats mss ON mss.TYPE_ID = kwd.ID AND mss.DATE = '2021-07-06' -- 这里写你要统计的日期,放在关联条件比where过滤更适合左连接保留无统计数据的关键词 GROUP BY kwd.ID, kwd.KEYWORD ORDER BY kwd.ID;
示例数据执行结果
用你提供的测试数据执行上述语句,输出结果如下:
| KWD | RESULTS Amazon | RESULTS eBay |
|---|---|---|
| testing | 33 | 22 |
| blablub | 3 | 6 |
完全符合你要求的每个关键词一行、各商家结果分独立列展示的需求。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

