来自数字列和hstore

时间:2016-10-31 18:48:57

标签: postgresql 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&combined-paymaym&#39;的付款方式和价格。这就是我不知道如何解决的问题。总结付款方式和价格来自&#39;组合付款&#39;来自&#39; paym&#39;和&#39;价格&#39;。

此查询给出结果:

"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 个答案:

答案 0 :(得分:2)

unnest the 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)