计算行内非空字段的数量

时间:2011-12-31 17:09:12

标签: sql select null count

  

可能重复:
  Count the Null columns in a row in SQL

我已经有了解决这个问题的答案,但找不到合适的答案,而且我是SQL的新手。

我有一个包含活动团队的表格,在其他列中我有team_member_1team_member_2team_member_3team_member_4team_member_5 。每个人都会存储该团队成员的名称,每个团队的成员数量不同(3到5人之间)。

我正在尝试通过计算该行/团队中的列/字段数NOT NULL来计算团队中的人数。

如果我的头脑会这样:

Select Count NOT NULL team_member_1, team_member_2, team_member_3,  
                      team_member_4, team_member_5 
from Teams 
where team_id = 5

当然这不起作用。然后我想把这个数字乘以20英镑(因为活动费用是每人20英镑),给我每个团队所欠的金额,这将在网站上反映出来。希望一切都有道理。

5 个答案:

答案 0 :(得分:3)

如果您的服务器产品支持布尔数据类型,并且在适当的上下文中隐式将其转换为整数,例如MySQL,那么您可以尝试以下模式:

SELECT
  (team_member_1 IS NOT NULL) +
  (team_member_2 IS NOT NULL) +
  (team_member_3 IS NOT NULL) +
  (team_member_4 IS NOT NULL) +
  (team_member_5 IS NOT NULL) AS MemberCount
FROM Teams
WHERE team_id = 5

答案 1 :(得分:2)

你应该有一个关系表TeamMember - >团队关系为1:n \ n:n。

然后在您的查询中加入两个表,由团队分组并计算团队成员。

select t.Id, count(tm.Id)
from teams t, teams_members tm
where t.Id = tm.Team_Id
group by t.Id

答案 2 :(得分:1)

Imho,这是一个非常糟糕的设计:)

首先,我会normalize数据库。如果这样做,您关于团队成员数量的问题就很简单SELECT COUNT(*) ...

为团队制作一张桌子,为会员制作一张桌子,为团队成员与团队“连接”。

答案 3 :(得分:1)

解决问题的关键是使用特定的if函数

对于Oracle,它可能是DECODE

SELECT 
 DECODE(COL1, null, 0, 1) +
 DECODE(COL2, null, 0, 1) +
 DECODE(COL3, null, 0, 1) +
 DECODE(COL4, null, 0, 1) AS Result
FROM YOUR_TABLE

对于MySQL,它可能是IF

SELECT 
 IF(COL1 is null, 0, 1) +
 IF(COL2 is null, 0, 1) +
 IF(COL3 is null, 0, 1) +
 IF(COL4 is null, 0, 1) AS Result
FROM YOUR_TABLE

我使用的是SQL Server,您应该使用CASE语句

SELECT
    CASE COL1 WHEN IS NULL THEN 0 ELSE 1 END + 
    CASE COL2 WHEN IS NULL THEN 0 ELSE 1 END +
    CASE COL3 WHEN IS NULL THEN 0 ELSE 1 END 
FROM YOUR_TABLE

答案 4 :(得分:-1)

正如其他人所指出的,这是一个糟糕的设计,你应该尝试规范化。但是,我会尝试这样的事情:

Select Count(*) from teams where
 (team_id = 5) and
 (team_member_1 is not null or
  team_member_2 is not null or
  team_member_3 is not null or
  team_member_4 is not null or
  team_member_5 is not null)

您应该通过创建一个Team表和一个Member表以及引用Team的成员来至少规范化到第一个普通表单。