我几乎没有包含包含加密货币金额的jsonb的字段“数据”的记录:
(加密货币在任何数量上都可以不同)
其任务是计算加密货币的总数,并得到如下内容:
CODE: SUM:
BTC 185.00002100
DOGE 2.00000000
我如何使用SQL来做到这一点呢?
发布于 2022-07-26 22:14:52
使用jsonb_each_text
在CROSS JOIN
中提取json记录的每个元素,然后按key
对values
进行分组。
SELECT j.key, sum(j.value::numeric)
FROM mytable
CROSS JOIN jsonb_each_text(data::jsonb) j (key,value)
GROUP BY j.key
演示:db<>fiddle
发布于 2022-07-26 22:14:56
一种自然的方法是在一行中得到和:
with my_table(data) as (
values
('{"BTC": "0.1"}'::jsonb),
('{"BTC": "0.2", "DOGE": "2.0"}'),
('{"BTC": "0.3"}')
)
select
sum((data->>'BTC')::numeric) as btc,
sum((data->>'DOGE')::numeric) as doge
from my_table;
btc | doge
-----+------
0.6 | 2.0
(1 row)
如果您坚持采用专栏式演示文稿:
with my_table(data) as (
values
('{"BTC": "0.1"}'::jsonb),
('{"BTC": "0.2", "DOGE": "2.0"}'),
('{"BTC": "0.3"}')
)
select code, sum((data->>code)::numeric)
from my_table
cross join unnest(array['BTC', 'DOGE']) as code
group by code
order by code;
code | sum
------+-----
BTC | 0.6
DOGE | 2.0
(2 rows)
https://stackoverflow.com/questions/73130040
复制相似问题