PostgreSQL、数字列和 hstore 中的 SUM 和 GROUP

问题描述 投票:0回答:1

我想请问是否有人可以为我创建一个查询,该查询可以对数字列和 hstore 列中的值进行求和。这对于我的 SQL 能力来说显然是太多了。

表:

DROP TABLE IF EXISTS mytry; 
CREATE TABLE IF NOT EXISTS mytry 
   (mybill int, price numeric, paym text, combined_paym hstore); 
INSERT INTO mytry (mybill, price, paym, combined_paym)
VALUES (10,  10.14, '0', ''),
       (11,  23.56, '0', ''),
       (12,  12.16, '3', ''),
       (13,  12.00, '6', '"0"=>"4","3"=>"4","2"=>"4"'),
       (14,  14.15, '6', '"0"=>"2","1"=>"4","3"=>"4","4"=>"4.15"'),
       (15,  13.00, '1', ''),
       (16,   9.00, '4', ''),
       (17,   4.00, '4', ''),
       (18,   4.00, '1', '');

这里是账单清单、每张账单的价格和付款方式。
某些帐单(此处为 13 和 14)可以合并付款。支付方式从0到5列举了具体的支付方式。
为此我提出这个查询:

SELECT paym, SUM(price) FROM mytry WHERE paym::int<6 GROUP BY paym ORDER BY paym;

这是付款方式 0-5 的价格总和。 6 不是付款方式,而是一个标志,这意味着我们应该在这里考虑来自 hstore 'combined_paym' 的付款方式和价格。这是我不知道如何解决的问题。将“组合付款”中的付款方式和价格与“付款”和“价格”中的付款方式和价格相加。

此查询给出结果:

"0";33.70
"1";17.00
"3";12.16
"4";13.00

但是结果不正确,因为这里没有对账单 13 和 14 的数据进行求和。
真正的结果应该是:

"0";39.70
"1";21.00
"2";4.00
"3";20.16
"4";17.15

如果有人可以让我进行正确的查询,这将从给定的数据中给出最后的结果。

postgresql aggregate-functions hstore
1个回答
2
投票

使用

each()
函数取消 hstore 列的嵌套:

select key, value::numeric(10,2)
from mytry
cross join each(combined_paym)
where paym::int = 6

并联合使用它:

select paym, sum(price)
from (     
    select paym, price
    from mytry
    where paym::int < 6
    union all
    select key, value::numeric(10,2)
    from mytry
    cross join each(combined_paym)
    where paym::int = 6
    ) s
group by 1
order by 1;

db<>fiddle 中测试它。

© www.soinside.com 2019 - 2024. All rights reserved.