SQL:根据条件对行求和

SQL: sum rows with conditions

我在数据库中有一个table如下:

date       account      side     size     
2022-01-01 1            buy      50
2022-01-01 1            sell     25
2022-01-01 1            buy      35
2022-01-01 1            sell     10
2022-01-01 2            buy      100
2022-01-01 2            sell     50
2022-01-02 1            buy      10
2022-01-02 1            sell     10
2022-01-02 2            buy      100
2022-01-02 2            sell     10

我想要的是在边是'sell'的时候减去尺码,在买的时候加上尺码,这样就可以了:

date       account      volume
2022-01-01 1            50
2022-01-01 2            50
2022-01-02 1            0  
2022-01-02 2            90

我试过以下方法

select date, account, sum(case when size='sell' then size = -size else size = size end) as volume
group by date, account, side, size

编辑: select date, account, sum(case when side='sell' then size = -size else size = size end) as volume group by date, account, side, size

但是我得到一个错误:ERROR: function sum(boolean) does not exist. HINT: No function matches the given name and argument types. You might need to add explicit type casts.

我做错了什么?

这里的方法是条件聚合,但您的逻辑有点不对。此外,您只想按日期和帐户进行汇总。

SELECT date, account,
       SUM(CASE WHEN size = 'buy' THEN size ELSE -size END) AS volume
FROM yourTable
GROUP BY date, account
ORDER BY date, account;

Tim 的回答是正确的,他解决了您遇到的多个问题。我只想详细说明为什么您会收到使用 sum/case 组合时出现的错误,这样您就可以了解您在那里做错了什么。

SUM 只是尝试将所有值相加,顾名思义,加法实际上只对数值有效。您实际上很幸运收到有关无效布尔值的错误消息,因为某些语言会将它们转换为布尔整数(1 或 0)并求和。

问题出在您对 CASE 的使用上。

sum(
  case 
    when side ='sell' then size = -size 
    else size = size 
  end
)

你正试图用它来改变一个值(如果满足条件,你正试图将 size 的值设置为 -size),但 CASE 子句实际上是要 return 一个值, thenelse 运算符之后的任何内容:在这种情况下,它将 return size = -sizesize = size。在这两种情况下,您都不是 return size 或 -size:您是 returning 比较结果,无论是真还是假,然后将这些布尔值传递给 SUM。

所以你要做的是确保 thenelse 之后的部分符合你(和 SUM)的期望:一个可求和的数值:

sum(
  case 
    when side ='sell' then -size 
    else size 
  end
)