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 一个值, then
和 else
运算符之后的任何内容:在这种情况下,它将 return size = -size
或 size = size
。在这两种情况下,您都不是 return size 或 -size:您是 returning 比较结果,无论是真还是假,然后将这些布尔值传递给 SUM。
所以你要做的是确保 then
或 else
之后的部分符合你(和 SUM)的期望:一个可求和的数值:
sum(
case
when side ='sell' then -size
else size
end
)
我在数据库中有一个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 一个值, then
和 else
运算符之后的任何内容:在这种情况下,它将 return size = -size
或 size = size
。在这两种情况下,您都不是 return size 或 -size:您是 returning 比较结果,无论是真还是假,然后将这些布尔值传递给 SUM。
所以你要做的是确保 then
或 else
之后的部分符合你(和 SUM)的期望:一个可求和的数值:
sum(
case
when side ='sell' then -size
else size
end
)