【问题标题】:How to get sum of amount from multiple accounts which return by join如何从通过加入返回的多个帐户中获取金额总和
【发布时间】:2018-02-12 10:49:26
【问题描述】:

我有 3 张桌子,例如:

owner_details:-

 owner_id   owner_name
    ---------------------
    1            A
    2            B    
    3            C
    -------------------

vehicle_owner:-

    v_id  vehicle_id   owner_id
    -------------------------
    1      1            1
    2      2            2
    3      4            1
    4      3            1 
    5      5            3 

交易:-

id   v_id         amount   transaction_type
--------------------------------
1      1           100       0
2      2           250       1
3      1           150       1
4      3           450       1
5      1           200       0
6      4           300       1
7      5           150       0
8      5           200       1

transaction_type=0 然后 (-) transaction_type=1 然后 (+)

车主 A (1) 在表 vehicle_owner 中有 3 辆具有 v_id (1,3,4) 的车辆。

v_id (1,3,4) 在表 transaction (1,3,4,5,6) 中有 5 个条目金额总和600(-100+150+450-200+300)

现在我想要这样的列表:-.

owner_id   owner_name  amount
    ---------------------
    1            A       600
    2            B       250
    3            C       50
    -------------------

【问题讨论】:

  • 你试过什么?看起来像简单的选择、求和、加入、分组……来吧……在这些东西上付出一些努力……
  • 实际上它是查询的一部分。主查询有多个 JOIN 的另一个表可以正常工作。现在我想在列表中显示特定所有者的总数
  • amount of A 应该是 1200。对吧?

标签: mysql sql


【解决方案1】:

您可以使用以下查询:

SELECT od.owner_id, od.owner_name, SUM(t.amount) AS amount 
FROM owner_details od INNER JOIN vehicle_owner vo ON od.owner_id = vo.owner_id 
    INNER JOIN `transaction` t ON vo.v_id = t.v_id 
GROUP BY od.owner_id

如果您想使用额外的transaction_type,您可以使用以下内容:

SELECT od.owner_id, od.owner_name, SUM(CASE WHEN t.transaction_type = 0 THEN t.amount * -1 ELSE t.amount END) AS amount 
FROM owner_details od INNER JOIN vehicle_owner vo ON od.owner_id = vo.owner_id 
    INNER JOIN `transaction` t ON vo.v_id = t.v_id 
GROUP BY od.owner_id

演示: http://sqlfiddle.com/#!9/c5f8d/1/1

【讨论】:

  • 感谢 Sebastian Brosch 的回答。但是如果我在表事务中有额外的列,比如 transaction_type 存储 0 或 1(0-借方,1-贷方),那么查询会发生什么变化?
  • 否,如果您不想在上述查询的结果中显示此列。
【解决方案2】:

试试这个:

SELECT A.owner_id, A.owner_name, SUM(IFNULL(amount,0)) AMOUNT
FROM owner_details A LEFT JOIN
vehicle_owner B
ON A.owner_id=B.owner_id
LEFT JOIN `transaction` C
ON C.v_id=B.v_id
GROUP BY A.owner_id, A.owner_name;

【讨论】:

    【解决方案3】:

    对我有用

    SELECT od.owner_id, 
               od.owner_name, 
               Sum(t.amount) AS amount 
        FROM   owner_details od 
               INNER JOIN vehicle_owner vo 
                       ON od.owner_id = vo.owner_id 
               INNER JOIN (SELECT v_id, 
                                  Coalesce(Sum(CASE 
                                                 WHEN type = 0 THEN -amount 
                                                 ELSE +amount 
                                               end), 0.0) AS amount 
                           FROM   `transaction` 
                           GROUP  BY v_id) t 
                       ON vo.v_id = t.v_id 
        GROUP  BY od.owner_id 
    

    感谢 Sebastian Brosch 的快速响应!!!

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2023-01-18
      相关资源
      最近更新 更多