sql - PostgreSQL SUM 不返回 0 行的值

标签 sql postgresql

我有一个交易表,每个交易都有一个地址字段,该字段引用地址表中的一行,地址表中的每个地址都有一个coinID。

我想获取特定用户的每种代币的所有交易总和。

我遇到的问题是,如果用户有 0 笔属于特定代币的交易或地址,那么结果将完全丢失。我需要币表中具有 0 笔交易或地址的所有币以总和为 0 的方式返回。

SELECT coins.name, SUM(transactions.amount),coins.price_usd
            FROM coins
            LEFT JOIN addresses ON addresses.coin_id = coins.id
            LEFT JOIN transactions ON transactions.address = addresses.address
            LEFT JOIN users ON transactions.user_id = users.id
            WHERE users.email = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c0b4a5b3b4a5ada1a9ac80a5ada1a9aceea3afad" rel="noreferrer noopener nofollow">[email protected]</a>'
            GROUP BY coins.name, coins.price_usd

最佳答案

此解决方案向您展示了您想要的内容:

create table coins (
  id int,
  name varchar(10),
  price_usd int
);

insert into coins (id, name, price_usd) values (1, 'Pound', 2);
insert into coins (id, name, price_usd) values (2, 'Yen', 98);
insert into coins (id, name, price_usd) values (3, 'Euro', 3);

create table addresses (
  coin_id int,
  address int
);

insert into addresses (coin_id, address) values (1, 20);
insert into addresses (coin_id, address) values (3, 30);

create table transactions (
  address int,
  user_id int,
  amount int
);

insert into transactions (address, user_id, amount) values (20, 500, 123);
insert into transactions (address, user_id, amount) values (20, 500, 101);
insert into transactions (address, user_id, amount) values (30, 501, 456);

create table users (
  id int,
  email varchar(50)
);

insert into users (id, email) values (500, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b3c7d6c0c7d6ded2dadff3d6ded2dadf9dd0dcde" rel="noreferrer noopener nofollow">[email protected]</a>');
insert into users (id, email) values (501, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fb9a95948f939e89bb9e969a9297d5989496" rel="noreferrer noopener nofollow">[email protected]</a>');

select coins.name, sum(transactions.amount),coins.price_usd
  from coins
  join addresses on addresses.coin_id = coins.id
  join transactions on transactions.address = addresses.address
  join users on transactions.user_id = users.id
  where users.email = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2357465057464e424a4f63464e424a4f0d404c4e" rel="noreferrer noopener nofollow">[email protected]</a>'
  group by coins.name, coins.price_usd
union all
select name, 0, 0
  from coins
  where id not in (
    select coin_id 
      from addresses
      join transactions on transactions.address = addresses.address
      join users on transactions.user_id = users.id
      where users.email = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="daaebfa9aebfb7bbb3b69abfb7bbb3b6f4b9b5b7" rel="noreferrer noopener nofollow">[email protected]</a>'
  );

结果:

name   sum  price_usd
-----  ---  ---------
Pound  224          2  -- the requested user
Yen      0          0  -- another user
Euro     0          0  -- coin with no transactions

关于sql - PostgreSQL SUM 不返回 0 行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777492/

相关文章:

sql - 在SQL INSERT SELECT Query中添加一个递增的数列

java - Android sqlite数据库报错SQLiteException no such column

mysql - Where 子句中的 SQL 更改条件

当行在不同的列上匹配时,SQL 查询返回列的最大值

Grails 无法连接到数据源,但 psql 可以吗?

python Postgresql CREATE DATABASE IF NOT EXISTS 是错误的

ruby-on-rails - Rails 和 PostgreSQL 中的时区和夏令时

sql - 在 unpivot 中包含 NULL 值

mysql - 使用分区修剪优化查询

ruby-on-rails - 神秘的 Mongrel Rails 崩溃