【问题标题】:Multiple sum on different cols in same query同一查询中不同列的多个总和
【发布时间】:2016-06-03 12:34:27
【问题描述】:

如果内部连接为真,是否可以对列求和,如果另一个内部连接为真,是否可以对另一个列求和?即

SELECT t1.debit 
     , t2.credit  
     , t1.ID 
     , t2.ID 
  FROM
     ( SELECT SUM(booking_value) debit 
            , gl_acct.id_fin_gl_acct ID 
         FROM bookings 
         JOIN gl_acct 
           ON (CONCAT('1',gl_acct.id_fin_gl_acct) = bookings.id_debit_account)
     ) t1 
  JOIN 
     ( SELECT SUM(booking_value) credit 
            , gl_acct.id_fin_gl_acct ID 
         FROM bookings 
         JOIN gl_acct 
           ON (CONCAT('1',gl_acct.id_fin_gl_acct)=bookings.id_credit_account)
     ) t2
    ON (t1.ID = t2.ID)
 GROUP  
    BY t1.ID

请解释你的答案。

【问题讨论】:

  • @spencer7593 我想得到每个用户的所有借方和贷方的总和,我看了这个answer,我写了这个查询,我将在另一个评论中发布它
  • SELECT t1.debit , t2.credit , t1.ID , t2.ID FROM ( SELECT sum(booking_value) as debit , gl_acct.id_fin_gl_acct as ID from bookings INNER JOIN gl_acct on (CONCAT('1',gl_acct.id_fin_gl_acct)=bookings.id_debit_account) )t1 INNER JOIN ( SELECT sum(booking_value) as credit , gl_acct.id_fin_gl_acct as ID from bookings INNER JOIN gl_acct on (CONCAT('1',gl_acct.id_fin_gl_acct)=bookings.id_credit_account) )t2 ON (t1.ID = t2.ID) GROUP BY t1.ID
  • 我觉得这个中奖了。

标签: mysql join sum


【解决方案1】:

条件聚合的示例。

 SELECT t.id_account
      , SUM(IF(t.cr_or_db='cr',t.tot_booking_value,0)) AS `tot_credit` 
      , SUM(IF(t.cr_or_db='db',t.tot_booking_value,0)) AS `tot_debit`
   FROM ( 
          SELECT 'cr'                  AS `cr_or_db`
               , c.id_credit_account   AS `id_account`
               , SUM(c.booking_value)  AS `tot_booking_value`
            FROM bookings c
           GROUP BY c.id_credit_account
           UNION ALL
          SELECT 'db'                  AS `cr_or_db`
               , d.id_debit_account    AS `id_account`
               , SUM(d.booking_value)  AS `tot_booking_value`
            FROM bookings d
           GROUP BY d.id_debit_account
        ) t
  GROUP 
     BY t.id_account 

内联视图t 为我们提供每个id_credit_account 的总贷方和每个id_debit_account 的总借方。

原始查询将这两个 id_ 列连接到同一个帐户表,因此我们假设它们都是另一个表的外键,这意味着它们是相同的数据类型...

只有在出于某种原因我们需要包含gl_acct 表时才需要连接操作。假设id_fin_gl_acctgl_acct 中是唯一的...我们可以在 GROUP BY 子句之前添加连接操作。

    ...   
        ) t

   JOIN gl_acct g
     ON CONCAT('1',g.id_fin_gl_acct) = t.id_account 

  GROUP 
     BY t.id_account 

【讨论】:

  • 我在之前创建了 GROUP,它是返回结果,但不是我想要的,因为内部连接会跳过不等效 id 的行,顺便说一下,感谢您的帮助和解释;)
  • @HussienAl-maani:对。使用 JOIN 操作,您将只返回两边都出现 id_account 值的行。如果一侧或另一侧缺少 id,则将排除行。这就是为什么我认为你想分别获得“总借方”和“总贷方”。为了将它们结合起来,我们可以使用 UNION ALL 操作。要获取单个行上每个 id 的结果,我们可以将组合集引用为内联视图,并使用 GROUP BY 操作,并使用条件聚合。
  • 你给我一个很好的例子,解释和解决方案,,再次感谢一切
猜你喜欢
  • 2017-07-14
  • 2013-05-31
  • 2013-12-30
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多