来自数字列和 hstore 的 PostgreSQL、SUM 和 GROUP
PostgreSQL, SUM and GROUP from numeric column and hstore
我想请问是否有人可以给我一个查询,该查询可以对数字列和 hstore 列的值求和。这显然对我的 SQL 能力来说太过分了。
一个table:
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' 的付款方式和价格。这是我不知道如何解决的问题。将 'combined paym' 中的付款方式和价格与 'paym' 和 'price' 中的付款方式和价格相加。
此查询给出结果:
"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
如果有人可以让我进行适当的查询,这将给出给定数据的最后结果。
取消嵌套 hstore 列:
select key, value::dec
from mytry, each(combined_paym)
where paym::int = 6
key | value
-----+-------
0 | 4
2 | 4
3 | 4
0 | 2
1 | 4
3 | 4
4 | 4.15
(7 rows)
并联合使用:
select paym, sum(price)
from (
select paym, price
from mytry
where paym::int < 6
union all
select key, value::dec
from mytry, each(combined_paym)
where paym::int = 6
) s
group by 1
order by 1;
paym | sum
------+-------
0 | 39.70
1 | 21.00
2 | 4
3 | 20.16
4 | 17.15
(5 rows)
我想请问是否有人可以给我一个查询,该查询可以对数字列和 hstore 列的值求和。这显然对我的 SQL 能力来说太过分了。
一个table:
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' 的付款方式和价格。这是我不知道如何解决的问题。将 'combined paym' 中的付款方式和价格与 'paym' 和 'price' 中的付款方式和价格相加。
此查询给出结果:
"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
如果有人可以让我进行适当的查询,这将给出给定数据的最后结果。
取消嵌套 hstore 列:
select key, value::dec
from mytry, each(combined_paym)
where paym::int = 6
key | value
-----+-------
0 | 4
2 | 4
3 | 4
0 | 2
1 | 4
3 | 4
4 | 4.15
(7 rows)
并联合使用:
select paym, sum(price)
from (
select paym, price
from mytry
where paym::int < 6
union all
select key, value::dec
from mytry, each(combined_paym)
where paym::int = 6
) s
group by 1
order by 1;
paym | sum
------+-------
0 | 39.70
1 | 21.00
2 | 4
3 | 20.16
4 | 17.15
(5 rows)