Postgresql:选择具有不同条件的总和

时间:2016-04-07 00:56:14

标签: postgresql

我有两个表格表:

予。表1如下:

------------------------------------------
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。表2如下:

------------------------------------------
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

我希望有一个这样的结果有两个(或更多)条件:

  1. sum pos和neg where codegroupid IN(' 1',' 2',' 3')
  2. 如果'开始%'
  3. 这样的类别,请不要对pos和neg求和

    所以结果会是这样的:

    ------------------------------------------
    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%'
    

    按codeid分组,codedesc;
    Sumpos是sum(pos),其中类别NOT ILIKE'开始%&#39 ;,但是如果类别ILKIE'开始%'使所有pos值变为零(0);
    Sumpos是sum(neg)类别NOT ILIKE' begin%&#39 ;,但是IF类别ILKIE' begin%'使所有的负值变为零;

    任何想法怎么做?

1 个答案:

答案 0 :(得分:1)

尝试:

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;