首页 > 解决方案 > 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可以结合DownStockif DownStock'sCode等于 's 中的前 4 个TopStock数字Code。我想要一个查询,显示每个TopStocks 的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 BYTopStock
Quantity| Code |ColorId|ModelId|RuyeId|DownQuantity
. 300 |290105| 23 | 44 | 1019 | 600 -> (3*200)
. 400 |290105| 19 | 44 | 1019 | 200

问题:3*200因为我有 3TopStock行相同的ColorIdModelId。我只想要 200 没有 600。有人可以解决这个问题吗?

标签: sqlsql-servergroup-by

解决方案


我删除了 的所有用途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  

推荐阅读