2016-10-31 2 views
2

Ich würde mich bitte fragen, ob jemand mir eine Abfrage machen könnte, die Werte von numerischen Spalte und von Hstore-Spalte SUM up. Dies ist offensichtlich zu viel für meine SQL-Fähigkeiten.PostgreSQL, SUM und GROUP aus numerischer Spalte und hstore

Eine Tabelle:

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', ''); 

Hier ist eine Liste von Rechnungen, Preis und Zahlungsmethode für jede Rechnung.
Einige Rechnungen (hier 13 und 14) könnten kombinierte Zahlung haben. Zahlungsmethoden sind von 0 bis 5 aufgeführt, die spezifische Zahlungsmethode beschreibt.
Dazu mache ich diese Anfrage:

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

Diese fasst die Preise für Zahlungsmethoden 0-5. 6 ist keine Zahlungsmethode, sondern eine Flagge, was bedeutet, dass wir hier Zahlungsmethoden und Preise von hstore 'combined_paym' betrachten sollten. Das weiß ich nicht zu lösen. Zahlungsmethoden und Preise von "kombinierter Zahlung" mit denen von "Zahlung" und "Preis" zu summieren.

Diese Abfrage gibt Ergebnis:

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

Aber Ergebnis ist falsch, da hier nicht summierten Daten von Bills 13 und 14
Echt Ergebnis sein sollte:

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

Bitte, wenn jemand kann mache mir eine richtige Abfrage, die das letzte Ergebnis von gegebenen Daten geben würde.

Antwort

2

UNNEST der hstore Säule:

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) 

und es in der Vereinigung verwenden:

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

Ich dachte an so etwas wie dies konnte sie aber nicht zusammen stellen. Groß! Dieser Look ist wie ein gutes Ergebnis. Außerdem benutze ich nie zuvor "each" anstelle von "-" zum Entknoten von hstore-Elementen. Danke für die Lösung und praktikables Beispiel. –