Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据ID group by从2个不同表求和,从第三个表返回的值是预期值的两倍_Mysql_Sql_Group By_Sum_Distinct Values - Fatal编程技术网

Mysql 根据ID group by从2个不同表求和,从第三个表返回的值是预期值的两倍

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 |

我在桌子下面吃饭

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 |   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您是对的。感谢您的及时帮助,但它仍然给出了双倍值。表示输出与我使用的查询相同。感谢您的提示帮助,但它仍然提供双精度值。表示输出与我使用的查询相同。