Sql 如何使用内部联接计算位
我有1个字段参与,返回类型为位,在我的数据库中,我希望将所有位相加,并创建一个新列。目前,它的工作,但我得到了错误的数据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
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列,但我已更新了我的问题。能否添加一些示例数据和实际再现问题的查询(当前查询可能不正确,因为它有一个joinID=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。。。