【问题标题】:how to count bits using INNER JOIN如何使用 INNER JOIN 计算位数
【发布时间】:2014-02-22 10:10:04
【问题描述】:

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

【问题讨论】:

  • 您的查询和结果不匹配:查询有列 field1、field2、field3 ... NoOfParticipation1、NoOfParticipation0,而结果有列 ID、Participation、NoOfParticipation1、NoOfParticipation0
  • 我已经更新了我的问题。
  • 您能否添加一些示例数据和一个实际重现问题的查询(当前查询不可能正确,因为它有一个连接ID = ID - 所以要么只有一个表实际上有一个@987654326 @ 列和它的笛卡尔变相加入,或者我们缺少部分)

标签: sql inner-join aggregate-functions


【解决方案1】:

您不应在GROUP BY 中包含Participation,而应使用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;

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

【讨论】:

  • 我已经更新了我的问题,我犯了一个错误 NoOfParticipation 列应该由 sum 函数创建
  • @Dip 我仍然不明白您的要求:您声明“我有 3 个字段具有返回类型作为位”,但在您的声明中,您只能访问一个:NoOfParticipation。您的问题中没有表定义。那么,另外两个位域是什么?他们如何参与结果计算?您声明“NoOfParticipation 列应由 sum 函数创建”。你的意思是?究竟应该总结什么?
  • 我想我把你弄糊涂了。好的 - 只有一个字段 Participation 有位作为返回。我想计算 1 和 0 的总数。应计算 1 并将其放入名为 NoOfParticipation1 的新列中,并将所有 0 放入名为 NoOfParticipation0 的另一列中
  • @Dip 因此,如果你只是从我上面的声明中省略了MAX(Participation) as Participation, 行,这是否达到了你想要的效果?
【解决方案2】:

如果您只希望每个 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 

【讨论】:

  • 如果我有额外的字段,如 ID、姓名、sname 等。我将如何让它出现。如果我说SELECT ID, Name, Surname etc... from ... group by ID,我会收到错误消息,说名称在所选列表中无效,因为它既不包含在聚合函数中,也不包含在 group by 子句中。如果我包含名称,我会得到同样的错误,但这次我会得到 sname。
  • 我不知道您的实际数据以及您想要实现的目标。您可能还需要将列添加到 GROUP BY(如果它们与分组 ID 来自同一个表)。或者,您将此查询放在派生表中并返回您的详细信息。或者,您在联接之前在派生表中进行聚合。如果您的 DBMS 支持窗口聚合函数,您还可以将 SUM 更改为 SUM(...) OVER (PARTITION BY ID) 并删除 GROUP BY...
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 2019-04-30
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多