Mysql 根据ID group by从2个不同表求和,从第三个表返回的值是预期值的两倍
我在桌子下面吃饭 1。物料单位:Mysql 根据ID group by从2个不同表求和,从第三个表返回的值是预期值的两倍,mysql,sql,group-by,sum,distinct-values,Mysql,Sql,Group By,Sum,Distinct Values,我在桌子下面吃饭 1。物料单位: id | material_unit 1 | Nos. 2 | lts 2。材料表: id | Material_name 1 | bricks 2 | Cement id | material_id | qty | unit 1 | 1 | 100 | 1 2 | 2 | 500 | 1 3 | 2 | 100 | 1 4 | 1 | 200 |
id | material_unit
1 | Nos.
2 | lts
2。材料表:
id | Material_name
1 | bricks
2 | Cement
id | material_id | qty | unit
1 | 1 | 100 | 1
2 | 2 | 500 | 1
3 | 2 | 100 | 1
4 | 1 | 200 | 1
id | material_id | qty | unit
1 | 1 | 50 | 1
2 | 1 | 50 | 1
3 | 2 | 100 | 1
4 | 2 | 200 | 1
3。Grn表格:
id | Material_name
1 | bricks
2 | Cement
id | material_id | qty | unit
1 | 1 | 100 | 1
2 | 2 | 500 | 1
3 | 2 | 100 | 1
4 | 1 | 200 | 1
id | material_id | qty | unit
1 | 1 | 50 | 1
2 | 1 | 50 | 1
3 | 2 | 100 | 1
4 | 2 | 200 | 1
4。消费表:
id | Material_name
1 | bricks
2 | Cement
id | material_id | qty | unit
1 | 1 | 100 | 1
2 | 2 | 500 | 1
3 | 2 | 100 | 1
4 | 1 | 200 | 1
id | material_id | qty | unit
1 | 1 | 50 | 1
2 | 1 | 50 | 1
3 | 2 | 100 | 1
4 | 2 | 200 | 1
预期结果如下:
Material Name | Unit | Total Qty | Total Consumed Qty | Stock
Bricks | Nos. | 300 | 100 | 200
Cement | Nos. | 600 | 300 | 300
因此,根据上述结果,总数量将从Grn表中提取,而消耗表和库存中的总消耗数量是两者的差异,应根据物料id进行分组
下面的查询返回GRN和消费表中的值之和,但将该和乘以消费表中的条目数
我犯了什么错误,请有人帮我找出错误
SELECT sm.material_name as 'Material Name', mu.material_unit as 'Material Unit', sum(g.qty) as 'GRN Qty', sum(c.qty) as 'Consumed Qty', SUM(g.qty) - SUM(c.qty) as 'Stock' from grn g
JOIN material_table sm ON g.material_id = sm.id
JOIN material_unit_table mu ON g.unit_id = mu.id
JOIN consumption c ON c.material_id = g.material_id
group by g.material_id
我认为您的问题是由于grn table是您的原始表,因此select为表中的每一行获取一行。将material_table设置为第一个表,并使用其ID将其余的表连接到该表中 请尝试这个版本,让我知道它是否正常工作(考虑到它可能包含错误,我已经把它写进了记事本)
希望有帮助 我认为您的问题是由于grn table是您的原始表,因此select为表中的每一行获取一行。将material_table设置为第一个表,并使用其ID将其余的表连接到该表中
WITH Grn AS (
SELECT
material_id,
unit,
SUM(qty) AS 'Total Qty'
FROM grn
GROUP BY
material_id,
unit
),
Consumption AS (
SELECT
material_id,
SUM(qty) AS 'Consumed Qty'
FROM consumption
GROUP BY
material_id
)
SELECT
m.Material_name AS 'Material Name',
u.Material_unit AS Unit,
g.[Total Qty],
c.[Consumed Qty],
g.[Total Qty] - c.[Consumed Qty] AS Stock
FROM Grn g
INNER JOIN Consumption c ON g.material_id = c.material_id
INNER JOIN material_unit_table u ON g.unit_id = u.Id
INNER JOIN material_table m ON g.material_id = m.Id
请尝试这个版本,让我知道它是否正常工作(考虑到它可能包含错误,我已经把它写进了记事本)
希望有帮助
WITH Grn AS (
SELECT
material_id,
unit,
SUM(qty) AS 'Total Qty'
FROM grn
GROUP BY
material_id,
unit
),
Consumption AS (
SELECT
material_id,
SUM(qty) AS 'Consumed Qty'
FROM consumption
GROUP BY
material_id
)
SELECT
m.Material_name AS 'Material Name',
u.Material_unit AS Unit,
g.[Total Qty],
c.[Consumed Qty],
g.[Total Qty] - c.[Consumed Qty] AS Stock
FROM Grn g
INNER JOIN Consumption c ON g.material_id = c.material_id
INNER JOIN material_unit_table u ON g.unit_id = u.Id
INNER JOIN material_table m ON g.material_id = m.Id
此查询将给出所需的结果
底线是在grn
和consumption
表中删除重复的material\u id
。通过这种方式,通过material\u id
连接表consumption
和grn
不会产生重复项
注意:为了使其工作,在grn
表中,每种材料只需要一个单元
此查询将给出所需的结果
底线是在grn
和consumption
表中删除重复的material\u id
。通过这种方式,通过material\u id
连接表consumption
和grn
不会产生重复项
注意:为了实现这一点,在
grn
表中,每种材料只需要一个单位。您的消耗量是行数的两倍,因此在加入之前对数量进行求和可以更正数量
SELECT
MAX(sm.material_name) as 'Material Name'
, MAX(mu.material_unit) as 'Material Unit'
, sum(g.qty) as 'GRN Qty'
, sum(c.qty) as 'Consumed Qty'
, SUM(g.qty) - SUM(c.qty) as 'Stock'
from grn g
inner JOIN material_table sm ON g.material_id = sm.id
inner JOIN material_unit_table mu ON g.unit = mu.id
INNER JOIN (SELECT `material_id`, SUM(`qty`) qty, `unit` FROM consumption GROUP BY `material_id`,`unit`) c ON c.material_id = g.material_id
GROUP BY g.material_id
示例您使用的行数是行数的两倍,因此,在加入之前对量子位求和可以更正这些行数
SELECT
MAX(sm.material_name) as 'Material Name'
, MAX(mu.material_unit) as 'Material Unit'
, sum(g.qty) as 'GRN Qty'
, sum(c.qty) as 'Consumed Qty'
, SUM(g.qty) - SUM(c.qty) as 'Stock'
from grn g
inner JOIN material_table sm ON g.material_id = sm.id
inner JOIN material_unit_table mu ON g.unit = mu.id
INNER JOIN (SELECT `material_id`, SUM(`qty`) qty, `unit` FROM consumption GROUP BY `material_id`,`unit`) c ON c.material_id = g.material_id
GROUP BY g.material_id
示例是否存在错误?
Bricks
的Stock
不应该是200吗?是的@Marko你是对的。有错误吗?Bricks
的Stock
不应该是200吗?是@Marko您是对的。感谢您的及时帮助,但它仍然给出了双倍值。表示输出与我使用的查询相同。感谢您的提示帮助,但它仍然提供双精度值。表示输出与我使用的查询相同。