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_codeproduct_keyproduct_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.qtytable_onetable_two 的 JOIN 引起了组合爆炸。

product_key totalQty totalReqQty
123456789 35 450 WRONG!

因此,您需要了解您的顶级 FROM table_one ... JOIN table_two ... JOIN product_table... 模式需要将 table_onetable_twoproduct_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

查看子查询如何分别汇总两个不同的表。如果你加入他们并总结他们,你会多次计算一些行。