如何使用INNER JOIN计算位数

时间:2014-01-30 08:06:36

标签: sql inner-join aggregate-functions

我有1个字段参与,返回类型为一个位,在我的数据库中我想总结所有位并创建一个新列。目前它的工作原理,但我得到错误的数据。

SELECT ID, Participation......,SUM(CASE WHEN NoOfParticipation = 1 THEN 1 ELSE 0 END) 
AS NoOfParticipation1, SUM(CASE WHEN NoOfParticipation = 0 THEN 1 ELSE 0 END) 
AS NoOfParticipation0 from table1 INNER JOIN table2 on ID=ID 
group by ID, Participation ......;

这些是我数据库中的记录:

    ID||Participation  
    1   0                                   
    1   0              
    1   0              

我正在寻找类似的东西:

ID||Participation||NoOfParticipation1 ||NoOfParticipation0
 1   0              0                    3

但目前我得到了:

   ID||Participation||NoOfParticipation1 ||NoOfParticipation0
   1   0              0                    1 - this should be 3
   . - further down the list i have records with the same ID
   .
   1   0              0                    1
   1   0              0                    1

2 个答案:

答案 0 :(得分:0)

如果每个ID只需要一行,则不应按其他列进行分组:

SELECT id, 
       Sum(CASE 
             WHEN participation = 1 THEN 1 
             ELSE 0 
           END) AS NoOfParticipation1, 
       Sum(CASE 
            WHEN participation = 0 THEN 1 
             ELSE 0 
           END) AS NoOfParticipation0 
FROM   table1 
       INNER JOIN table2 
               ON id = id 
GROUP  BY id 

答案 1 :(得分:0)

您不应在Participation中加入GROUP BY,而应使用SUMMAXMIN等汇总功能。哟没有在你的问题中说明你想要哪一个,我只会使用MAX

SELECT ID,
       MAX(Participation) as Participation,
       SUM(CASE WHEN NoOfParticipation = 1 THEN 1 ELSE 0 END) AS NoOfParticipation1,
       SUM(CASE WHEN NoOfParticipation = 0 THEN 1 ELSE 0 END) AS NoOfParticipation0
 from table1 INNER JOIN table2 on table1.ID = table2.ID 
group by ID;

如果您在ID中使用Participationgroup by,则每个不同的IDParticipation值组合会得到不同的行。我理解您的问题的方式是您希望每个ID的结果中包含一行。因此,这必须是GROUP BY中的唯一列,并且必须对所有其他列使用聚合函数。