【问题标题】:Get total of referenced tables' column获取引用表列的总数
【发布时间】:2014-02-21 12:47:57
【问题描述】:

考虑一个账户和存款数据库:

CREATE TABLE accounts (
    id int not null primary key,
    name varchar(63)
);

CREATE TABLE deposits (
    id int not null primary key,
    account int references accounts(id),
    dollars decimal(15, 2),
    status enum('pending','complete') 
);


insert into accounts values
(0, 'us'),
(1, 'europe'),
(2, 'asia');

insert into deposits values
(0, 0, 10, 'pending'),
(1, 0, 20, 'complete'),
(2, 1, 100, 'complete'),
(3, 1, 200, 'pending'),
(4, 1, 300, 'complete'),
(5, 2, 1000, 'pending');

我想得到每个银行所有complete 存款的总数,这是预期的结果:

+--------+-----+
| us     | 20  |
| europe | 400 |
| asia   | 0   |
+--------+-----+

这是我尝试过的 SQL,但它没有按预期工作:

SELECT
    a.name, SUM(d.dollars)
FROM
    accounts a
  INNER JOIN
    deposits d ON (a.id = d.account AND d.status='complete');

这是它给出的结果:

+--------+-----+
| us     | 420 |
+--------+-----+

Here is an SQLfiddle的当前代码。

我做错了什么,我怎样才能得到预期的金额?

【问题讨论】:

  • 你忘了按银行分组

标签: mysql sql join sum


【解决方案1】:

试试这个

 SELECT
a.name, coalesce(SUM(d.dollars),0) as sums
FROM
accounts a
left JOIN
deposits d ON (a.id = d.account AND d.status='complete')
group by  a.name
order by sums desc

你应该使用 LEFT JOIN ,你也应该使用 GROUP BY。

LOOK DEMO

【讨论】:

    【解决方案2】:

    您应该使用a.name(甚至可能是a.id)和LEFT OUTER JOIN(如果您想获得非当前值)进行分组。

    编辑:

    SELECT
        a.name, SUM(d.dollars)
    FROM
        accounts a
      LEFT OUTER JOIN
        deposits d ON (a.id = d.account AND d.status='complete')
    GROUP BY a.name;
    

    【讨论】:

      【解决方案3】:

      试试这个查询:

      SELECT
      a.name, IF(SUM(d.dollars) IS NULL, 0, SUM(d.dollars) )
      FROM
          accounts a
        LEFT JOIN
          deposits d ON (a.id = d.account AND d.status='complete')
      GROUP BY a.name ORDER BY a.id;
      

      【讨论】:

        【解决方案4】:

        通过加入有存款的账户,您只需确保为与账户关联的存款合计美元。如果您还按帐户名称或帐户 ID 进行分组,那么您将获得一个 Sum/bank。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-05
          • 2020-11-27
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多