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

Postgresql:选择具有不同条件的总和,postgresql,Postgresql,我有两张桌子: 一、表1如下: ------------------------------------------ codeid | pos | neg | category ----------------------------------------- 1 | 10 | 3 | begin2016 1 | 3 | 5 | justhere 3 | 7 | 7 | justthere 4 |

我有两张桌子:

一、表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
------------------------------------------
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
------------------------------------------
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%'
二,。表2如下所示:

------------------------------------------
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
------------------------------------------
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
------------------------------------------
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%'
我希望有一个这样的结果,有两个(或更多)条件:

  • pos和neg之和,其中codegroupid位于('1','2','3')
  • 但如果类别为“开始%”,则不要求正和负之和
  • 因此,结果如下所示:

    ------------------------------------------
    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
    
    ------------------------------------------
    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
    
    ------------------------------------------
    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),其中类别不象“begin%”,但如果类别ILKIE“begin%”使所有pos值变为零(0)
    Sumpos是sum(neg),其中类别不象“begin%”,但如果类别ILKIE“begin%”使所有的neg值变为零

    有什么办法吗

    试试看:

    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;
    

    结果是否应该包含所有代码ID(1-8)的记录?我想也许您只需要codegroupid=1或2的记录,但您的结果是显示worker(codegroupid=3)。不清楚您的结果集是否只是显示子集。很抱歉,我已将coudegroupid编辑为1、2或3。非常感谢。