Join table SQL PHP 中列的总和不起作用
The SUM of column in Join table SQL PHP not working
我正在尝试从 table table_two
计算并获取列 count
的总和。我正在尝试通过 Left Join
函数获取列的总和。但它无法正常工作,我得到的列的总和存在于 table_two
.
中
我在联合 table 和 left JOIN
中不是很完美 你能帮我看看如何在我的代码中使用联合函数吗?
我在这个 Whosebug 上展示了多个线程,但相信我,它很难理解并且非常大。这就是为什么我在这里制作一个小的 table 以寻求帮助并且易于理解。
先生,请帮助我不要将其标记为重复和关闭。我在过去的 1 周内都在尝试,但没有代码工作。
我正在尝试的代码是 -
SELECT *, SUM(table_two.count) AS totalQTY, SUM(table_one.qty) AS totalReqQty
FROM table_one
LEFT JOIN table_two
ON table_one product_key = product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
table_one
| ID | product_key | insert_date | qty
|------|------------------|--------------|------
| 1 | 123456789 | 2021-02-01 | 150
------------------------------------------------
table_two
| ID | product_code | add_date | count
|------|-------------------|--------------|-------
| 1 | 123456789 | 2021-02-02 | 10
| 2 | 123456789 | 2021-02-03 | 20
| 3 | 123456789 | 2021-02-04 | 5
--------------------------------------------------
product_table
| ID | product_ids | product_name
|------|-------------------|----------------------
| 1 | 123456789 | XYZ
--------------------------------------------------
Expecting Output:
| ID | product_key | product_name | qty | count |
|------|-------------------|---------------------------------
| 1 | 123456789 | XYZ | 150 | 35 |
-------------------------------------------------------------
您没有标记您正在使用的数据库,但是从每个数据库获取聚合的一种方法是使用 apply
。
我还建议您修改 ProductId 命名约定中的不一致之处,您将其称为 product_code
、product_key
和 product_ids
。决定如何称呼它并保持一致 将使其他人更容易理解。
select p.product_ids as product_key, p.product_name, coalesce(q.Qty,0) totalQty, coalesce(c.[count],0) [Count]
from product_table p
outer apply (
select sum(qty) Qty
from table_one t1
where t1.product_key=p.product_ids
group by t1.product_key
)q
outer apply (
select Sum(count) [count]
from table_two t2
where t2.product_code=p.product_ids
group by t2.product_code
)c
query you showed us 不起作用。
如果您想使用 aggregate functions like SUM() your best bet is to start by running the query without them. For example
汇总/汇总/您的数据
SELECT *
FROM table_one
LEFT JOIN table_two
ON table_one.product_key = table_two.product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
你得到这个结果。请注意,它有三行,数量 150
显示在所有三行中。
ID
product_key
insert_date
qty
ID
product_code
add_date
count
ID
product_ids
product_name
1
123456789
2021-02-01
150
1
123456789
2021-02-02
10
1
123456789
XYZ
1
123456789
2021-02-01
150
2
123456789
2021-02-03
20
1
123456789
XYZ
1
123456789
2021-02-01
150
3
123456789
2021-02-04
5
1
123456789
XYZ
然后请记住,当您对多行求和时,这些行中的详细信息(例如,table_1.ID
)不再有意义。三行加起来你要哪个ID?
所以你可以something like this
SELECT table_one.product_key,
SUM(table_two.count) totalQty,
SUM(table_one.qty) totalReqQty
FROM table_one
LEFT JOIN table_two
ON table_one.product_key = table_two.product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
GROUP BY table_one.product_key
这给出了这个结果,这是不正确的——它是三重和 table_one.qty
。 table_one
和 table_two
的 JOIN 引起了组合爆炸。
product_key
totalQty
totalReqQty
123456789
35
450 WRONG!
因此,您需要了解您的顶级 FROM table_one ... JOIN table_two ... JOIN product_table...
模式需要将 table_one
、table_two
和 product_table
中的一行连接在一起对于每个产品。在此设置中,您可以 product_table
。每个产品一行。
但是其他表中每个产品可以有多个行。所以你需要在子查询中对它们求和,并加入子查询,like this.
SELECT product_table.product_ids,
table_two_summary.totalQty,
table_one_summary.totalReqQty
FROM product_table
LEFT JOIN (
SELECT product_code, SUM(count) totalQty
FROM table_two
GROUP BY product_code
) table_two_summary
ON product_table.product_ids = table_two_summary.product_code
LEFT JOIN (
SELECT product_key, SUM(qty) totalReqQty
FROM table_one
GROUP BY product_key
) table_one_summary
ON product_table.product_ids = table_one_summary.product_key
编辑 如果您需要对汇总列进行过滤,您可以这样做 like this.
SELECT product_table.product_ids,
table_two_summary.totalQty,
table_one_summary.totalReqQty
FROM product_table
LEFT JOIN (
SELECT product_code, SUM(count) totalQty
FROM table_two
GROUP BY product_code
) table_two_summary
ON product_table.product_ids = table_two_summary.product_code
LEFT JOIN (
SELECT product_key, SUM(qty) totalReqQty
FROM table_one
GROUP BY product_key
) table_one_summary
ON product_table.product_ids = table_one_summary.product_key
WHERE table_one_summary.totalReqQty > table_two_summary.totalQty
查看子查询如何分别汇总两个不同的表。如果你加入他们并总结他们,你会多次计算一些行。
我正在尝试从 table table_two
计算并获取列 count
的总和。我正在尝试通过 Left Join
函数获取列的总和。但它无法正常工作,我得到的列的总和存在于 table_two
.
我在联合 table 和 left JOIN
中不是很完美 你能帮我看看如何在我的代码中使用联合函数吗?
我在这个 Whosebug 上展示了多个线程,但相信我,它很难理解并且非常大。这就是为什么我在这里制作一个小的 table 以寻求帮助并且易于理解。
先生,请帮助我不要将其标记为重复和关闭。我在过去的 1 周内都在尝试,但没有代码工作。
我正在尝试的代码是 -
SELECT *, SUM(table_two.count) AS totalQTY, SUM(table_one.qty) AS totalReqQty
FROM table_one
LEFT JOIN table_two
ON table_one product_key = product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
table_one
| ID | product_key | insert_date | qty
|------|------------------|--------------|------
| 1 | 123456789 | 2021-02-01 | 150
------------------------------------------------
table_two
| ID | product_code | add_date | count
|------|-------------------|--------------|-------
| 1 | 123456789 | 2021-02-02 | 10
| 2 | 123456789 | 2021-02-03 | 20
| 3 | 123456789 | 2021-02-04 | 5
--------------------------------------------------
product_table
| ID | product_ids | product_name
|------|-------------------|----------------------
| 1 | 123456789 | XYZ
--------------------------------------------------
Expecting Output:
| ID | product_key | product_name | qty | count |
|------|-------------------|---------------------------------
| 1 | 123456789 | XYZ | 150 | 35 |
-------------------------------------------------------------
您没有标记您正在使用的数据库,但是从每个数据库获取聚合的一种方法是使用 apply
。
我还建议您修改 ProductId 命名约定中的不一致之处,您将其称为 product_code
、product_key
和 product_ids
。决定如何称呼它并保持一致 将使其他人更容易理解。
select p.product_ids as product_key, p.product_name, coalesce(q.Qty,0) totalQty, coalesce(c.[count],0) [Count]
from product_table p
outer apply (
select sum(qty) Qty
from table_one t1
where t1.product_key=p.product_ids
group by t1.product_key
)q
outer apply (
select Sum(count) [count]
from table_two t2
where t2.product_code=p.product_ids
group by t2.product_code
)c
query you showed us 不起作用。
如果您想使用 aggregate functions like SUM() your best bet is to start by running the query without them. For example
汇总/汇总/您的数据SELECT *
FROM table_one
LEFT JOIN table_two
ON table_one.product_key = table_two.product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
你得到这个结果。请注意,它有三行,数量 150
显示在所有三行中。
ID | product_key | insert_date | qty | ID | product_code | add_date | count | ID | product_ids | product_name |
---|---|---|---|---|---|---|---|---|---|---|
1 | 123456789 | 2021-02-01 | 150 | 1 | 123456789 | 2021-02-02 | 10 | 1 | 123456789 | XYZ |
1 | 123456789 | 2021-02-01 | 150 | 2 | 123456789 | 2021-02-03 | 20 | 1 | 123456789 | XYZ |
1 | 123456789 | 2021-02-01 | 150 | 3 | 123456789 | 2021-02-04 | 5 | 1 | 123456789 | XYZ |
然后请记住,当您对多行求和时,这些行中的详细信息(例如,table_1.ID
)不再有意义。三行加起来你要哪个ID?
所以你可以something like this
SELECT table_one.product_key,
SUM(table_two.count) totalQty,
SUM(table_one.qty) totalReqQty
FROM table_one
LEFT JOIN table_two
ON table_one.product_key = table_two.product_code
LEFT JOIN product_table
ON table_two.product_code = product_table.product_ids
GROUP BY table_one.product_key
这给出了这个结果,这是不正确的——它是三重和 table_one.qty
。 table_one
和 table_two
的 JOIN 引起了组合爆炸。
product_key | totalQty | totalReqQty |
---|---|---|
123456789 | 35 | 450 WRONG! |
因此,您需要了解您的顶级 FROM table_one ... JOIN table_two ... JOIN product_table...
模式需要将 table_one
、table_two
和 product_table
中的一行连接在一起对于每个产品。在此设置中,您可以 product_table
。每个产品一行。
但是其他表中每个产品可以有多个行。所以你需要在子查询中对它们求和,并加入子查询,like this.
SELECT product_table.product_ids,
table_two_summary.totalQty,
table_one_summary.totalReqQty
FROM product_table
LEFT JOIN (
SELECT product_code, SUM(count) totalQty
FROM table_two
GROUP BY product_code
) table_two_summary
ON product_table.product_ids = table_two_summary.product_code
LEFT JOIN (
SELECT product_key, SUM(qty) totalReqQty
FROM table_one
GROUP BY product_key
) table_one_summary
ON product_table.product_ids = table_one_summary.product_key
编辑 如果您需要对汇总列进行过滤,您可以这样做 like this.
SELECT product_table.product_ids,
table_two_summary.totalQty,
table_one_summary.totalReqQty
FROM product_table
LEFT JOIN (
SELECT product_code, SUM(count) totalQty
FROM table_two
GROUP BY product_code
) table_two_summary
ON product_table.product_ids = table_two_summary.product_code
LEFT JOIN (
SELECT product_key, SUM(qty) totalReqQty
FROM table_one
GROUP BY product_key
) table_one_summary
ON product_table.product_ids = table_one_summary.product_key
WHERE table_one_summary.totalReqQty > table_two_summary.totalQty
查看子查询如何分别汇总两个不同的表。如果你加入他们并总结他们,你会多次计算一些行。