【问题标题】:Join two tables and summing over the columns using MySQL joins连接两个表并使用 MySQL 连接对列求和
【发布时间】:2021-10-09 10:58:48
【问题描述】:

如果我再次问这个问题,我很抱歉。我已经尝试了所有可能的解决方案,但没有提出解决方案。 我还在这里附上了一个 sqlfiddle link to the problem来复制问题。

我有两个表:Contracts 和 Contracts_balance

对于我正在编写查询的每个表: 对于合约,使用此查询总结 ord_qty 列并按(product_name、pack_size 和 startr_date)分组:

SELECT  c.contract_id, c.product_name, c.pack_size, sum(c.qty), c.contract_prod, c.end_date,c.start_date
From contracts c
GROUP BY c.product_name,c.start_Date , c.pack_size  

输出如下所示:

table contracts

对于contracts_balance,使用此查询对 balance_aftermonths 列求和并按(product_name、pack_size 和 startr_date)分组:

  SELECT cb.contract_id_fk, cb.product_name, cb.pack_size, cb.monthlydates , SUM(cb.balance_aftermonth) as mysum
            FROM contracts_balance cb
           WHERE MONTH(cb.monthlydates) = 3
     GROUP BY cb.product_name, cb.start_Date , cb.pack_size   ;  

输出如下所示: table contracts_balance

我正在尝试组合这两个查询,因此输出如下所示:

desired output

我的问题解决方法:正如在 sqlfddle 中所写,我正在使用 join 对列求和,但它显示了错误的结果

SELECT  c.contract_id, c.product_name, c.pack_size, sum(c.qty), c.contract_prod, c.end_date,c.start_date, test.mysum,test.monthlydates
From contracts c
JOIN
( SELECT cb.contract_id_fk, cb.product_name, cb.pack_size, cb.member, cb.monthlydates , SUM(cb.balance_aftermonth) as mysum
            FROM contracts_balance cb
           WHERE MONTH(cb.monthlydates) = 3
     GROUP BY cb.product_name, cb.start_Date , cb.pack_size     

          ) test on (test.contract_id_fk = c.contract_id)
          
GROUP BY c.product_name,c.start_Date , c.pack_size  

【问题讨论】:

  • 嗨@KhalidTeli,请在您的加入条件中添加product_name 和pack_size。

标签: mysql join subquery union distinct


【解决方案1】:

在加入条件中添加product_name和pack_size与contractid以获得预期结果。

-- MySQL (v5.6)
SELECT  c.contract_id, c.product_name, c.pack_size, sum(c.qty), c.contract_prod, c.end_date,c.start_date, test.mysum,test.monthlydates
From contracts c
JOIN
( SELECT cb.contract_id_fk, cb.product_name, cb.pack_size, cb.member, cb.monthlydates , SUM(cb.balance_aftermonth) as mysum
            FROM contracts_balance cb
           WHERE MONTH(cb.monthlydates) = 3
     GROUP BY cb.product_name, cb.start_Date , cb.pack_size     

          ) test on (test.contract_id_fk = c.contract_id
                    AND c.product_name = test.product_name
                    AND c.pack_size = test.pack_size)
          
GROUP BY c.product_name,c.start_Date , c.pack_size  ;

请查看此网址http://sqlfiddle.com/#!9/f1cef6/97

【讨论】:

  • 嗨@KhalidTeli,请检查此查询,如果有任何查询与此有关,请告诉我。
  • 嗨@Khalid Teli 我已经重写了您现有的查询。只需在 ON 子句中添加两个新条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多