【问题标题】:The SUM of column in Join table SQL PHP not working [duplicate]连接表SQL PHP中列的总和不起作用[重复]
【发布时间】:2021-06-17 15:58:52
【问题描述】:

我正在尝试从表 table_two 中计算并获取列 count 的总和。我正在尝试通过Left Join 函数获取并获取列的总和。但它无法正常工作,并且我得到的列的总和存在于table_two 中。

我在left JOIN 的联合表中并不完美,请您帮助我了解如何在我的代码中使用联合函数。 我在这个 StackOverflow 上展示了多个线程,但相信我这很难理解而且非常大。这就是为什么我在这里制作一张小桌子以寻求帮助并且易于理解。

先生,请帮我不要将其标记为重复和关闭。我正在尝试过去 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   | 
-------------------------------------------------------------

【问题讨论】:

    标签: mysql join left-join union aggregate-functions


    【解决方案1】:

    您尚未标记您正在使用的数据库,但是从每个数据库获取聚合的一种方法是使用 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
    

    【讨论】:

    • [ 意外字符错误
    • OQ 使用 MySQL。这个[] 的东西是 SQL Server。
    【解决方案2】:

    query you showed us 不起作用。

    如果您想通过使用 aggregate functions(如 SUM())来汇总/汇总/您的数据,最好的办法是在没有它们的情况下运行查询。 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_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
    

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

    【讨论】:

    • 你让我开心,但是当我使用 where 条件和此代码 sum(table_one.qty) > sum(table_two.count) 时,它不起作用
    • 请看我的编辑。而且,恕我直言,“不工作”并不是一个有意义的陈述。它可能意味着从“给出不正确的结果”到“抛出语法错误”到“让我的服务器着火并烧毁我的数据中心”。如果您检查代码错误并尝试给出更有意义的解释,您将获得技能。
    • 但它不起作用table_one_summary.product_key不保存
    • 请解决这个问题
    • 但是您的代码显示空值https://www.db-fiddle.com/f/xd4rax25LYQQFRfxGv7erN/5 请查看您的 db_fiddle 并帮助我们改进这一点
    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 2021-05-21
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多