2016-10-31 40 views
2

我想請問,如果有人可以讓我一個查詢,可能會從數值列和hstore列的值。這顯然對於我的SQL能力來說太多了。PostgreSQL,SUM和GROUP從數字列和hstore

一個表:

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_pa​​ym'的付款方式和價格。這是我不知道如何解決的。將'聯合付款'與'付款'和'價格'的付款方式和價格相加。

這個查詢給出的結果:

"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 

請,如果有人能讓我正確的查詢,它會給出給定數據的最後結果。

回答

2

UNNEST的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) 
+0

我想過這樣的事情,但無法把它在一起。大!這看起來就像它給出了正確的結果。此外,我從未使用'each'代替 - >來取消hstore元素。感謝您提供解決方案和可行的示例。 –