PostgreSQL, SUM и GROUP из числового столбца и hstore
Я хотел бы спросить, может ли кто-нибудь сделать мне запрос, который может суммировать значения из числового столбца и из столбца 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 "комбинированный_платеж". Это то, что я не знаю, как решить. Суммировать способы оплаты и цены из "комбинированной оплаты" с "платежами" и "ценой".
Этот запрос дает результат:
"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
Пожалуйста, если кто-то может сделать мне правильный запрос, который дал бы этот последний результат из данных.
1 ответ
Разверните столбец 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)