sql - SQL GROUP BY 不会为两个表的组合返回正确的结果
问题描述
我是 SQL 新手,遇到了麻烦。我有两张桌子:
1. TopStock : Id |RuyeId| Code |ModelId|Quantity|ColorId
.............: 1 | 1019 |290105| 44 | 100 | 23
.............: 2 | 1019 |290105| 44 | 150 | 23
.............: 3 | 1019 |290105| 44 | 400 | 19
.............: 4 | 1019 |290105| 44 | 50 | 23
.............: 4 | 1018 |280102| 21 | 800 | 14
2. DownStock : Id|KafiId| Code |Quantity|ColorId
.............: 1 | 1005 | 2901 | 200 | 21
这是我的场景: TopStock
可以结合DownStock
if DownStock
'sCode
等于 's 中的前 4 个TopStock
数字Code
。我想要一个查询,显示每个TopStock
s 的GROUP BY: ModelId,ColorId
总数量和可以与之结合的 DownStocks 的总数量。
这是我的查询:
SELECT DISTINCT SUM(top.Quantity) as Quantity, MAX(top.Code) as Code
MAX(top.ColorId) as ColorId, MAX(top.ModelId) as ModelId, MAX(top.RuyeId) as RuyeId,
SUM(down.Quantity) as DownQuantity
FROM TopStock as top JOIN DownStock as down ON top.Code like '%'+down.Code+'%'
WHERE top.Status = 0
GROUP BY top.ModelId, top.ColorId, top.Code, down.Code
我想要这个结果:
Quantity| Code |ColorId|ModelId|RuyeId|DownQuantity
. 300 |290105| 23 | 44 | 1019 | 200
. 400 |290105| 19 | 44 | 1019 | 200
实际上DownQuantity
应该是每个ed项目可能DownStock
数量的总和。但查询返回:GROUP BY
TopStock
Quantity| Code |ColorId|ModelId|RuyeId|DownQuantity
. 300 |290105| 23 | 44 | 1019 | 600 -> (3*200)
. 400 |290105| 19 | 44 | 1019 | 200
问题:3*200
因为我有 3TopStock
行相同的ColorId
和ModelId
。我只想要 200 没有 600。有人可以解决这个问题吗?
解决方案
我删除了 的所有用途MAX
,您按列分组,没有理由对它们进行聚合函数,因为只有 1 个值。另外,不要同时使用 distinct 和 group by。我还加入了一个求和表,以避免加入中的重复
SELECT SUM(top.Quantity) as Quantity,top.Code, top.ColorId, top.ModelId,
top.RuyeId, max(down.Quantity) as DownQuantity
FROM TopStock top
JOIN (SELECT down.code, sum(down.quantity) as quantity FROM DownStock down
GROUP BY down.code) down
ON top.Code like '%'+down.Code+'%'
WHERE top.Status = 0
GROUP BY top.ModelId, top.ColorId, top.Code, down.Code
推荐阅读
- powershell - 为什么从 powershell 调用批处理文件时插入符号会消失?
- mysql - SQL 中部分数据的平均值
- css - 使用媒体查询修改 body 和 html 标签的字体大小
- python - 如何正确读取 pandas 中合并的合并标题单元格
- html - 表格行内的文本突出显示
- windows - 任务调度程序日志输出
- laravel - 解析错误:语法错误,laravel 5.3 中出现意外的“$pdf”(T_VARIABLE)
- node.js - 登录路由重定向到索引路由,但未在任何地方指定,但单个中间件
- c++ - 函数 C++ 中的动态分配
- javascript - 在多个条件下使用 RegExp