2016-04-07 22 views
1

Ich habe zwei Tabelle Tabelle:Postgresql: Wählen Summe mit unterschiedlichen Bedingungen

I. Tabelle 1 wie folgt aus:

------------------------------------------ 
codeid | pos | neg | category 
----------------------------------------- 
    1 | 10 | 3 | begin2016 
    1 | 3 | 5 | justhere 
    3 | 7 | 7 | justthere 
    4 | 1 | 1 | else 
    4 | 12 | 0 | begin2015 
    4 | 5 | 12 | begin2013 
    1 | 2 | 50 | now 
    2 | 5 | 33 | now 
    5 | 33 | 0 | Begin2011 
    5 | 11 | 7 | begin2000 

II. Tabelle 2 wie folgt:

------------------------------------------ 
codeid | codedesc   | codegroupid 
----------------------------------------- 
1  | road runner  | 1 
2  | bike warrior | 2 
3  | lazy driver  | 4 
4  | clever runner | 1 
5  | worker   | 3 
6  | smarty   | 1 
7  | sweety   | 3 
8  | sweeper   | 1 

Ich möchte dieses Ergebnis haben, wie zwei (oder mehr) Bedingungen:

  1. Summe pos und neg, wo codegroupid IN ('1', '2', '3')
  2. aber nicht pos und neg summieren, wenn Kategorie wie 'beginnen%'

So mögen das Ergebnis dieses:

------------------------------------------ 
codeid |  codedesc  | sumpos | sumneg 
----------------------------------------- 
1 | roadrunner  | 5  | 55 => (sumpos = 3+2, because 10 have category like 'begin%' so doesn't sum) 
2 | bike warrior  | 5  | 33 
4 | clever runner | 1  | 1 
5 | worker   | 0  | 0 => (sumpos=sumneg=0) becase codeid 5 category ilike 'begin%' 

Gruppe nach CodeID, Codedesk;
Summierung ist Summe (pos), wobei die Kategorie NICHT ILIKE '% beginnt', ABER wenn die Kategorie ILKIE 'begin%' bewirkt, werden alle pos-Werte zu Null (0);
Summierung ist Summe (neg) wo die Kategorie NICHT ILIKE '% beginnt', ABER wenn Kategorie ILKIE 'begin%' bewirkt, werden alle negativen Werte zu Null;

Irgendwelche Ideen, wie es geht?

+0

Sollte das Ergebnis haben Aufzeichnungen für alle codeids (1 - 8)? Ich dachte, vielleicht wollten Sie nur Datensätze, bei denen codegroupid = 1 oder 2 ist, aber Ihr Ergebnis zeigt worker (codegroupid = 3). Es ist nicht klar, ob Ihre Ergebnismenge nur eine Teilmenge anzeigt. –

+0

Es tut mir leid, ich habe coudegroupid zu 1 oder 2 oder 3 bearbeitet. Vielen Dank. – bandungeuy

Antwort

1

Versuchen:

SELECT 
    b.codeid, 
    b.codedesc, 
    sum(CASE WHEN category LIKE 'begin%' THEN 0 ELSE a.pos END) AS sumpos, 
    sum(CASE WHEN category LIKE 'begin%' THEN 0 ELSE a.neg END) AS sumneg 
FROM 
    table1 AS a 
    JOIN 
    table2 AS b ON a.codeid = b.codeid 
WHERE b.codegroupid IN (1, 2, 3) 
GROUP BY 
    b.codeid, 
    b.codedesc; 
+0

Vielen Dank! Das ist das, was ich benötige.. – bandungeuy

Verwandte Themen