Sql 如何使用内部联接计算位

Sql 如何使用内部联接计算位,sql,inner-join,aggregate-functions,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 f

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

如果每个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 

您不应将
参与
包括在
分组中,而应使用聚合函数,如
求和
最大
、或
最小
。你没有在问题中说明你想要哪一个,我只使用
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
参与
,您将根据不同的
ID
参与
值组合获得不同的行。我理解您的问题的方式是,您希望每个
ID
在结果中有一行。因此,这必须是
分组依据
中的唯一列,并且必须对所有其他列使用聚合函数

您的查询和结果不匹配:查询包含字段1、字段2、字段3。。。NoOfParticipation1,NoOfParticipation0,虽然结果有ID列、Participation列、NoOfParticipation1列、NoOfParticipation0列,但我已更新了我的问题。能否添加一些示例数据和实际再现问题的查询(当前查询可能不正确,因为它有一个join
ID=ID
——因此,要么只有一个表实际上有一个
ID
列,而它是一个伪装的笛卡尔连接,要么我们缺少部分)我已经更新了我的问题,我犯了一个错误NoOfParticipation列应该由sum创建function@Dip我仍然不理解您的要求:您声明“我有3个字段有一点返回类型”,但在您的语句中,您只访问一个:
NoOfParticipation
。您的问题中没有表定义。那么,其他两位字段是什么?它们如何参与结果计算?您声明“NoOfParticipation列应通过sum函数创建”.你是什么意思?到底应该加什么?我想我把你弄糊涂了。好吧-只有一个字段
参与
有位作为回报。我想计算1和0的总数。1应该计算并放入名为
NoOfParticipation1
的新列中,所有0都放入另一个名为
N的列中OOFPparticipation0
@Dip因此,如果您省略了行
MAX(参与)作为参与者,
从我上面的陈述中,这是否提供了您想要的?如果我有其他字段,如ID、名称、sname等,我将如何显示。如果我说
选择ID、名称、姓氏等…从…按ID分组
我会收到错误消息,说名称在所选列表中无效,因为它不包含在任何聚合中函数或group by子句。如果我包含name,我会得到相同的错误,但这次我得到sname。我不知道您的实际数据以及您试图实现的目标。您可能还需要将列添加到group by(如果它们与分组ID来自同一个表)。或者您将此查询放在派生表中并连接回您的详细信息。或者您在连接之前在一个Dervied表中进行聚合。如果您的DBMS支持窗口聚合函数,您还可以将总和更改为SUM(…)OVER(PARTITION BY ID)并删除GROUP BY。。。